EntityFramework 保存约束

Posted

技术标签:

【中文标题】EntityFramework 保存约束【英文标题】:EntityFramework save with constraints 【发布时间】:2017-06-30 14:36:10 【问题描述】:

我有一个对不可空字段有限制的数据库。

我们只看一个:ModifiedDate。

在 INSERT 命令中未提供值时,约束默认为 getdate()。

我的代码使用的是实体框架,所以我制作了一个入口对象,创建了一个日期时间实例,设置了它的 ModifiedDate 字段,然后执行 context.SaveChanges(),它工作正常。

但是,如果我创建对象并且不设置 entry.ModifiedDate 那么 context.SaveChanges() 在约束设置默认值之前失败

【问题讨论】:

不可为空的字段应该有值。所以在数据库级别而不是实体框架分配默认值。 【参考方案1】:

在您的实体类中,您可以使用以下内容注释您的 ModifiedDate 属性:

[DatabaseGenerated(DatabaseGenerationOption.Computed)]
public DateTime ModifiedDate  get; set; 

来自 BOL:DatabaseGenerated

一个重要的数据库功能是计算能力 特性。如果您将 Code First 类映射到 包含计算列,您不希望 Entity Framework 尝试 更新这些列。但是您确实希望 EF 从 插入或更新数据后的数据库。您可以使用 DatabaseGenerated 注释以标记您的类中的这些属性 以及 Computed 枚举。

【讨论】:

您也可以通过 .edmx 设计器执行此操作。选择您的 DateTime 列并转到属性并将 StoreGeneratedPattern 从 None 更改为 Computed。 这非常有效!但是,我们将采用 db-first 方法,那么 EF 有什么方法可以使用此注释为模型搭建支架?我问的原因是因为有很多表,每个表都有一个 ModifiedDate 和 SysModifiedUser 字段。 @toadfromgrove 猜测您使用的是不保留默认约束的 EF6?您可以为将属性设置为解决方法的实体创建部分类。 @ChrisPickford 是的,我刚刚查了一下,它是 EF 6.1.3。在 NuGet 中,它将 6.1.3 显示为最新的稳定版本。是否有更新的版本在搭建脚手架时考虑了约束? 我相信 EF7 可以,但不要引用我的话。

以上是关于EntityFramework 保存约束的主要内容,如果未能解决你的问题,请参考以下文章

尝试插入具有 1:N 关系的实体时,重复键值违反 EntityFramework 中的唯一约束“PK_Users”错误

将房间数据库中的唯一约束添加到多列

Entity Framework 6 Code First 方法 - 唯一约束不起作用

如何使用 EntityFramework 4.1 CodeFirst 防止十进制值在保存时被截断为 2 位? [复制]

Entity Framework 4.1 Code First,一对一,一个表连接到复合键的单个键字段

html Ready Theme Nav Entites