我对属性DatabaseGenerate(DatabaseGeneratedOption.Computed)
有疑问,似乎是Seed方法中的AddOrUpdate()
调用不尊重它。
我做了一个简单的项目来说明我的问题:
public class EFModel : DbContext
{
public EFModel()
: base("name=EFModel")
{
}
public virtual DbSet<MyEntity> MyEntities { get; set; }
}
public class MyEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[StringLength(50)]
public string Name { get; set; }
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[StringLength(50)]
public string DefaultName { get; set; }
}
种子电话
protected override void Seed(DummyEF.EFModel context)
{
context.MyEntities.AddOrUpdate(new MyEntity { Id = 10, Name = "Samual", DefaultName = "Sam" });
context.MyEntities.AddOrUpdate(new MyEntity { Id = 11, Name = "David" });
}
当我运行Update-Database
命令时,第一个种子行(that is with Samual, and specifying a value for the default name
)运行正常。当我使用第二行(即使用Dadid,而不指定DefaultName的值)运行它时,它会失败:
一个或多个实体的验证失败。看到 'EntityValidationErrors'属性以获取更多详细信息。
它自己的表是有效的,并且有一个默认约束,所以正常插入到via SQL中。
种子似乎忽略了这样一个事实 实体属性标有 DatabaseGeneratedOption.Computed属性。
知道为什么会被忽略吗?
我首先使用EF 6代码。
答案 0 :(得分:1)
当您使用DatabaseGeneratedOption.Computed时,您告诉EF不要添加或更新数据库中的信息,因为数据库将像时间戳或计算的SQL列一样生成它,因此尝试播种该列是没有意义的。您收到验证错误,因为您已将其标记为必需。
答案 1 :(得分:0)
结论必须是当前版本的EF 6不能满足所需属性和DatabaseGenerated(DatabaseGeneratedOption.Computed)的组合
因此,如果想要将列设置为不可为空,但在保存到数据库之前避免EF验证它,则无法使用Required属性。
我想现在需要使用Fluent API或迁移代码的修改。