EF Seed忽略DatabaseGeneratedOption.Computed属性

时间:2015-06-08 10:18:04

标签: c# entity-framework ef-code-first migration

我对属性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代码。

2 个答案:

答案 0 :(得分:1)

当您使用DatabaseGeneratedOption.Computed时,您告诉EF不要添加或更新数据库中的信息,因为数据库将像时间戳或计算的SQL列一样生成它,因此尝试播种该列是没有意义的。您收到验证错误,因为您已将其标记为必需。

答案 1 :(得分:0)

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

因此,如果想要将列设置为不可为空,但在保存到数据库之前避免EF验证它,则无法使用Required属性。

我想现在需要使用Fluent API或迁移代码的修改。