EF种子忽略DatabaseGeneratedOption.计算属性
本文关键字:计算 属性 DatabaseGeneratedOption 种子 EF | 更新日期: 2023-09-27 17:54:21
我对属性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; }
}
The Seed call
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'属性获取更多详细信息。
表本身是有效的,并且有默认约束,所以通过SQL正常插入可以工作。
似乎就是这样,种子忽略了这个事实标记实体属性DatabaseGeneratedOption。计算属性。
知道为什么这个被忽略了吗?
我首先使用EF 6代码
当你使用DatabaseGeneratedOption。您告诉EF不要在数据库中添加或更新信息,因为数据库会像时间戳或计算SQL列一样生成这些信息,因此尝试对该列进行种子处理是没有意义的。您正在得到验证错误,因为您已将其标记为必需。
结论必须是当前版本的EF 6不满足属性Required和DatabaseGenerated(DatabaseGeneratedOption.Computed)的组合
因此,如果想将列设置为不可空,但又避免EF在保存到数据库之前对其进行验证,则不能使用Required属性。
我认为应该使用Fluent API或修改迁移代码。