2013-04-08 93 views
0

爲什麼我不能在實體框架中使用數據庫集默認值?當我設計我的數據庫時,我添加了適當的默認值(即「默認值或綁定」字段)。現在看來,我必須在代碼中指定這些默認值,除非我使用StoreGeneratedPattern.Computed,但之後我不允許更改該值。如果我沒有在代碼中指定默認值,我會得到一個異常。爲什麼我不能使用數據庫集默認值?

回答

0

這裏有一些邏輯。

在你的實體中你有public int ExampleInt {get;組; }。假設您將示例列的默認值設置爲100.

想象一下創建實體對象的情況。它是一個C#對象,缺省值由運行時填充。 ExampleInt用值0初始化。此時,實體對象對數據庫一無所知。然後你決定保存實體。 EF將不得不創建一行,然後插入您指定的值。可是等等?這應該是0還是100?如果您對該字段進行了更改,EF將不得不跟蹤,但是如果您創建了實體對象,則在您將其附加/保存之前,EF並不知道它。

只是一個想法:如果你在構造函數中運行一個查詢來檢查默認值?這將作爲你創建對象的時刻,它將被填充默認值。如果該對象是由EF創建的,則該值將被您在db中的值覆蓋。其實,我有一個更好的主意。

爲什麼不使用工廠來創建新的實體對象?工廠可以查詢數據庫的默認值?它仍然不是很好,但更好的是在構造中運行查詢。所以:

public class ExampleFactory 
{ 
    public static GetExample() 
    { 
     // obviously you want to run it only once. This is example only. 
     int defaultValue = dbContext.Database.SQLQuery("SqlToGetTheDefaultValue"); 
     return new Example { ExampleInt = defaultValue }; 
    } 
} 

所以你去了。現在你知道EF爲什麼不能做到這一點。我也給了你(壞)的想法,你怎麼解決這個問題。

+0

但是,如果EF元數據可以包含默認值並且在數據庫更新時更新,那將會很好。我只是不喜歡在不止一個地方擁有不變的價值觀。 *嘆* – Jordan 2013-04-09 20:06:16

+0

我同意,這可能是很好的。 http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions – 2013-04-09 20:19:58

+0

您是否看到:「具有StoreGeneratedPattern.Computed的屬性可以在應用程序中設置,但不使用該值。唯一的例外是ConcurrencyMode.Fixed屬性,只有在實體沒有被上下文跟蹤時設置它們,我纔會使用這些屬性,我將在另一篇博文中進一步討論這個問題,因爲它是實體框架中樂觀併發處理的一個大問題。 http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/ – 2013-04-09 20:33:01

相關問題