0

快速信息:實體框架4.1 - 創建主鍵值

  • 使用EF 4.1代碼第一次。
  • 使用沒有屬性修飾的POCO類。
  • 在EntityTypeConfiguration中使用流暢的配置<>類將POCO映射到數據庫。
  • 繼DDD模式,使用通用庫,總根,規格等

問題:

對於設置爲標識主鍵的實體,DatabaseGeneratedOption.Identity應該正常工作。

但是,在我們當前的模式中,有一種「有趣」的方式來創建主鍵。調用一個存儲過程來創建「下一個」唯一鍵以使用(爲幾個不同的表調用同一個存儲過程以確保所有這些鍵都有唯一鍵)。這是來自傳統結構,我不打算在這篇文章中介紹,但我需要能夠實現它。

我將地圖設置爲DatabaseGeneratedOption.None。插入記錄之前處理檢索新ID的最佳方法是什麼?有沒有我可以在DbContext上處理的事件?

謝謝! DatabaseGeneratedOption的

回答

1

值設定EF與屬性如何應對:

  • None - 標準的屬性。 EF將在選擇期間加載其值,允許應用程序修改該值並保留該值。
  • Identity - EF期望插入記錄時該屬性將由數據庫設置。插入記錄時,EF會自動將此值加載回實體。它不一定是數據庫中的標識列 - 它也可以是由觸發器生成的值。應用程序無法爲標記爲身份的屬性設置值
  • Computed - EF期望在每次修改之後,此屬性可以在數據庫中更改。它會在每次插入或更新後重新加載值。應用程序無法爲標記爲身份的屬性設置值。

所以如果你想在你的應用程序中調用程序,你必須使用None。如果您在插入觸發器之前決定使用該程序,則必須使用Identity

DatabaseGeneratedOption.Identity表示插入記錄時將在數據庫中設置值。 DatabaseGeneratedOption.Computed表示每次更新記錄時將在數據庫中設置值。

+0

對不起,我應該說我的帖子結尾好一點。澄清:在實際插入之前設置ID的最佳方法(觸發器對我們不起作用)是什麼? – junkyspace

+1

在您的上下文中覆蓋'SaveChanges'。在'ChangeTracker'中找到'Added'狀態下的所有實體,併爲其中的每一個調用該SP來設置它們的ID。 –

+0

我再次感謝您的幫助:) – junkyspace