这是对这个问题的跟进 Entity Framework 4 not respecting database constraints for numeric fields
是否有可能实现以下目标
表:Foo
PkId - int,primary,autoincrement
Bar - int,允许null = false,无默认值现在从中生成EF模型 数据库'Bar'字段是 正确定义为Nullable = false,Type = Int32。
现在,当我执行以下操作时
var foo = new Foo();
context.AddToFoos(FOO);
context.SaveChanges();该行是否已插入数据库,“Bar”的值为0?
我期望的是应用程序级异常,因为Bar在技术上并未由应用程序设置。其.Net默认值不会自动转换为特定数据库的有效值。
行为应类似于DB中的字符串列。正确处理字符串是因为它们具有空状态并且转换良好。
数字列通常如何实现?
答案 0 :(得分:0)
当您不想存储0时,不要忘记在模型对象中设置Bar
属性的值。当您创建新对象并调用SaveChanges
时,INSERT命令为发送到数据库,其中包含映射到数据库表的所有您的模型属性的值。类中的int
属性始终为值,并且您已将此值设置为0 - 即通过调用对象的构造函数。
EF不会只将对象的一半发送到数据库,这是Object-Relational-Mapper的基本要点。当然,通过提交原始SQL INSERT命令,您只能设置表行列值的一半,如果没有为Bar
列设置值,则会出现异常。但是当您使用ORM时,您不会提交INSERT命令,但会存储新对象。
究竟是什么问题?如果没有Bar
的值有效,则该列应为可为空且属性为int?
。如果它必须具有值而不是值0,则需要在对象的构造函数中将Bar
设置为1或其他内容,或者在保存对象之前应用适当的验证。
您希望拥有的异常是不可能的,在我看来没有任何意义,因为在INSERT命令中设置一个值是不可能的不 EF将在存储对象时提交