Entity framework 4 为不可为空的数值字段定义约束的实体框架

Entity framework 4 为不可为空的数值字段定义约束的实体框架,entity-framework-4,Entity Framework 4,这是这个问题的后续行动 是否有可能实现以下目标 表:富 PkId-int,主,自动增量 Bar-int,允许null=false,无默认值 现在,当从生成EF模型时 “栏”字段所在的数据库为 正确定义为null=false,Type=Int32 现在当我做下面的事情时 var foo=新foo; context.addtofoooo; 上下文变化 该行已插入数据库,且“Bar”的值为0 我所期望的是一个应用程序级异常,因为从技术上讲,Bar并不是由应用程序设置的。其.Net默认值不会自动转换为

这是这个问题的后续行动

是否有可能实现以下目标

表:富 PkId-int,主,自动增量 Bar-int,允许null=false,无默认值

现在,当从生成EF模型时 “栏”字段所在的数据库为 正确定义为null=false,Type=Int32

现在当我做下面的事情时

var foo=新foo; context.addtofoooo; 上下文变化

该行已插入数据库,且“Bar”的值为0

我所期望的是一个应用程序级异常,因为从技术上讲,Bar并不是由应用程序设置的。其.Net默认值不会自动转换为特定数据库的有效值

行为应该类似于数据库中的字符串列。字符串被正确处理,因为它们有一个空状态,这可以很好地转换


数值列通常是如何实现的?

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

EF不只是将对象的一半发送到数据库,这是对象关系映射器的一个基本点。当然,通过提交原始SQLINSERT命令,您只能设置表行的列值的一半,如果不为Bar列设置值,则会出现异常。但是,当您使用ORM时,您不会提交INSERT命令,而是存储新对象

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


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

谢谢,请确保在代码中设置值是可以的,但这不是问题所在。设想一个场景,20多个不同的应用程序将数据写入数据库。DB约束表示必须为此列提供有效值。如果ORM能够遵守这个约束,那就太好了,因为我无法保证每个应用程序都能正确实现。这种功能已经存在20多年了。如果字段不脏,不要将其写入数据库或抛出。不要只是将框架中的任意默认值写入DB。@bic:在某种意义上,新对象的所有属性都是脏的,并且对于更新,只有更改的列在更新命令中发送到DB,因此该约束才受到尊重。约束检查的类型是必要的,因为在关系数据库中,您可以在创建新行时设置单个列。在ORM和OO数据库中,您不能这样做,因此不需要进行约束检查。也许这是一个对象-关系阻抗不匹配的例子:一个没有默认值的SIMPE数据类型不存在于O端,就像在R端没有缺省列一样。@ BIC:另一点:考虑您和POCOs一起工作。对象是在上下文之外的某个地方创建的,例如在另一个程序集中,或者它甚至来自任何类型的远程服务,而处于连接另一端的开发人员明确地将Bar设置为0,因为它是他想要存储的有效值。EF如何识别这是在对象构造函数中创建的默认值,还是在代码中明确设置的值?我想不可能。如果该值已明确设置或未明确设置,这种检测是不可能的,至少在POCOs中是不可能的。@Slauma:没有默认值的simpe数据类型不存在,如果这是真的,我很惊讶EF不支持通过属性设置器跟踪更改。新对象的初始状态可能为“添加”,但尚未设置属性,因此不应包含在基础DB语句中。这似乎相对简单。In32中的私有成员已初始化,但未通过公共setter进行初始化。无论如何,感谢您的反馈。@Slauma:将值显式设置为0不是问题。应用程序已经设置了值,这很好。在本例中,问题不是实际值0,而是在数据库明确要求时未设置该值。