實體框架定義約束這是一個跟進這個問題
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默認值不會自動轉換爲特定數據庫的有效值。
該行爲應該與數據庫中的字符串列類似。字符串被正確處理,因爲它們有一個空狀態,這很好地轉換。
這對於數字列通常如何實現?
感謝時提交,請務必設置代碼中的值很好,但那不是問題。想象一下有20多個不同應用程序將數據寫入數據庫的場景。數據庫約束表示「您必須爲此列提供有效值」。由於我不能保證每個應用程序都正確實現,所以ORM尊重這個約束是很好的。這種功能已經存在了20多年。如果該字段不是髒的,不要將其寫入數據庫或拋出。不要從框架寫入任何默認值到數據庫。 – bic 2011-05-24 15:03:54
@bic:約束條件是尊重的,因爲* new *對象的所有屬性都是髒的,並且只有更新的列纔會在更新命令中發送到數據庫。約束檢查的類型只是必需的,因爲在關係數據庫中,您可以在創建新行時設置單個列。在一個ORM(以及OO數據庫)中你不能,因此約束檢查是不必要的。也許這是一個「對象 - 關係阻抗不匹配」的例子:在「O」端不存在默認值的簡單數據類型,例如「R」端沒有默認值的列。 – Slauma 2011-05-24 15:33:02
@bic:另一點:考慮你使用POCO。一個對象是在上下文之外創建的「某處」,例如在另一個程序集中創建的,或者它來自任何遠程服務,另一方面的開發人員將「Bar」明確設置爲0,因爲它是他想存儲的有效值。 EF如何識別這是否是在對象構造函數中創建的「默認值」,或者是否已在代碼中明確設置?我想不出來。這種檢測,如果值已被明確設定是不可能的,至少在POCO中是這樣。 – Slauma 2011-05-24 15:45:27