2011-05-24 87 views
0

實體框架定義約束這是一個跟進這個問題
Entity Framework 4 not respecting database constraints for numeric fields不可爲空的數字字段

是否有可能實現以下

表:富
PKID - INT,主,自動增量
Bar-int,允許null = false,無默認值

現在,當從生成EF模型時數據庫中'Bar'字段爲 正確定義爲Nullable = false,Type = Int32。

現在,當我做以下操作時

var foo = new Foo();
context.AddToFoos(foo);
context.SaveChanges();

該行插入到數據庫中,'Bar'的值爲0?

我期望的是應用程序級別的異常,因爲Bar在技術上還沒有被應用程序設置。其.Net默認值不會自動轉換爲特定數據庫的有效值。

該行爲應該與數據庫中的字符串列類似。字符串被正確處理,因爲它們有一個空狀態,這很好地轉換。

這對於數字列通常如何實現?

回答

0

當您不想存儲0時,請不要忘記在模型對象中設置Bar屬性的值。創建新對象並調用SaveChanges時,將向數據庫發送INSERT命令,該數據庫包含值爲全部您的模型屬性被映射到數據庫表。一個類中的int屬性始終有一個值,並且您已將此值設置爲0 - 即通過調用該對象的構造函數。

EF不會僅將對象的一半發送到數據庫,這是Object-Relational-Mapper的基本要點。當然,通過提交原始SQL INSERT命令,您可以只設置錶行的列值的一半,並且如果您沒有爲Bar列設置值,則會發生異常。但是當你使用ORM時,你不提交INSERT命令,但是你存儲了新的對象。

究竟是什麼問題?如果沒有Bar的值是有效的,則該列應該是可空的,並且該屬性爲int?。如果它必須有一個值,但不是值0,那麼它是在對象的構造函數中將Bar設置爲1或某物的問題,或者在保存對象之前應用適當的驗證。

你想擁有的那種例外的是不可能的,是沒有意義的,我的意見,因爲這是不可能的設置在INSERT命令EF值將存儲對象

+0

感謝時提交,請務必設置代碼中的值很好,但那不是問題。想象一下有20多個不同應用程序將數據寫入數據庫的場景。數據庫約束表示「您必須爲此列提供有效值」。由於我不能保證每個應用程序都正確實現,所以ORM尊重這個約束是很好的。這種功能已經存在了20多年。如果該字段不是髒的,不要將其寫入數據庫或拋出。不要從框架寫入任何默認值到數據庫。 – bic 2011-05-24 15:03:54

+0

@bic:約束條件是尊重的,因爲* new *對象的所有屬性都是髒的,並且只有更新的列纔會在更新命令中發送到數據庫。約束檢查的類型只是必需的,因爲在關係數據庫中,您可以在創建新行時設置單個列。在一個ORM(以及OO數據庫)中你不能,因此約束檢查是不必要的。也許這是一個「對象 - 關係阻抗不匹配」的例子:在「O」端不存在默認值的簡單數據類型,例如「R」端沒有默認值的列。 – Slauma 2011-05-24 15:33:02

+0

@bic:另一點:考慮你使用POCO。一個對象是在上下文之外創建的「某處」,例如在另一個程序集中創建的,或者它來自任何遠程服務,另一方面的開發人員將「Bar」明確設置爲0,因爲它是他想存儲的有效值。 EF如何識別這是否是在對象構造函數中創建的「默認值」,或者是否已在代碼中明確設置?我想不出來。這種檢測,如果值已被明確設定是不可能的,至少在POCO中是這樣。 – Slauma 2011-05-24 15:45:27