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代码

EF种子忽略DatabaseGeneratedOption.计算属性

当你使用DatabaseGeneratedOption。您告诉EF不要在数据库中添加或更新信息,因为数据库会像时间戳或计算SQL列一样生成这些信息,因此尝试对该列进行种子处理是没有意义的。您正在得到验证错误,因为您已将其标记为必需。

结论必须是当前版本的EF 6不满足属性Required和DatabaseGenerated(DatabaseGeneratedOption.Computed)的组合

因此,如果想将列设置为不可空,但又避免EF在保存到数据库之前对其进行验证,则不能使用Required属性。

我认为应该使用Fluent API或修改迁移代码。