我想手动为所有实体插入ID。 是否可以创建某种约定,或者我必须为每个实体设置HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)(或添加DatabaseGenerated属性)?
修改
有一种更简单的方法可以使用接受的答案:
modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();
答案 0 :(得分:5)
可以在EntityFramework 6中创建自定义约定,如下所示:
创建一个约定类
public class ManualIdentityConvention : Convention
{
public ManualIdentityConvention()
{
this.Properties<int>()
.Where(p => p.Name.EndsWith("Id"))
.Configure(p => p.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None));
}
}
将约定添加到DbContext
public class Context : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(new ManualIdentityConvention());
}
}
EntityFramework 5
对于EntityFramework 5,我相信可以实现类似的东西,但不能通过约定类:
public class Context : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<int>()
.Where(x => x.Name.EndsWith("Id"))
.Configure(x => x.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None));
}
}
在任何一种情况下,这两种方法都不是特别外科手术,但可以想象一下,通过在其中的where where子句中更具体来收紧惯例。
这有帮助吗?