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 位? [复制]