EF 种子忽略 DatabaseGeneratedOption.Computed 属性
EF Seed ignoring the DatabaseGeneratedOption.Computed attribute
我对属性 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 指定值)它失败了:
Validation failed for one or more entities. See
'EntityValidationErrors' property for more details.
table 本身是有效的,并且有一个默认约束,所以通过 SQL 正常插入是有效的。
It just seems to be the case, that the Seed is ignoring the fact that
the entity property is marked with the
DatabaseGeneratedOption.Computed attribute.
知道为什么这会被忽略吗?
我首先使用 EF 6 代码。
当您使用 DatabaseGeneratedOption.Computed 时,您是在告诉 EF 不要添加或更新数据库中的信息,因为数据库会像时间戳或计算的 SQL 列一样生成它,因此它使得尝试为该专栏播种是没有意义的。您收到验证错误,因为您已将其标记为必需。
结论必须是当前版本的 EF 6 不适合属性 Required 和 DatabaseGenerated(DatabaseGeneratedOption.Computed)
的组合
因此,如果要将列设置为不可为空,但又要避免 EF 在保存到数据库之前对其进行验证,则不能使用 Required 属性。
估计需要改用FluentAPI或者修改迁移代码
我对属性 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 指定值)它失败了:
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
table 本身是有效的,并且有一个默认约束,所以通过 SQL 正常插入是有效的。
It just seems to be the case, that the Seed is ignoring the fact that the entity property is marked with the DatabaseGeneratedOption.Computed attribute.
知道为什么这会被忽略吗?
我首先使用 EF 6 代码。
当您使用 DatabaseGeneratedOption.Computed 时,您是在告诉 EF 不要添加或更新数据库中的信息,因为数据库会像时间戳或计算的 SQL 列一样生成它,因此它使得尝试为该专栏播种是没有意义的。您收到验证错误,因为您已将其标记为必需。
结论必须是当前版本的 EF 6 不适合属性 Required 和 DatabaseGenerated(DatabaseGeneratedOption.Computed)
的组合因此,如果要将列设置为不可为空,但又要避免 EF 在保存到数据库之前对其进行验证,则不能使用 Required 属性。
估计需要改用FluentAPI或者修改迁移代码