实体框架为非可空数字字段定义约束

时间:2011-05-24 14:09:04

标签: entity-framework-4

这是对这个问题的跟进 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中的字符串列。正确处理字符串是因为它们具有空状态并且转换良好。

数字列通常如何实现?

1 个答案:

答案 0 :(得分:0)

当您不想存储0时,不要忘记在模型对象中设置Bar属性的值。当您创建新对象并调用SaveChanges时,INSERT命令为发送到数据库,其中包含映射到数据库表的所有您的模型属性的值。类中的int属性始终为值,并且您已将此值设置为0 - 即通过调用对象的构造函数。

EF不会只将对象的一半发送到数据库,这是Object-Relational-Mapper的基本要点。当然,通过提交原始SQL INSERT命令,您只能设置表行列值的一半,如果没有为Bar列设置值,则会出现异常。但是当您使用ORM时,您不会提交INSERT命令,但会存储新对象。

究竟是什么问题?如果没有Bar的值有效,则该列应为可为空且属性为int?。如果它必须具有值而不是值0,则需要在对象的构造函数中将Bar设置为1或其他内容,或者在保存对象之前应用适当的验证。

您希望拥有的异常是不可能的,在我看来没有任何意义,因为在INSERT命令中设置一个值是不可能的 EF将在存储对象时提交