jos*_*rry 11 c# entity-framework entity-framework-4 ef-code-first
一年前提出的这个问题是类似的: 实体框架4是否支持像NHibernate这样的id值的生成器?
但我想知道的是,代码首先是CTP是否增加了对身份生成策略的支持.如果没有,有没有人知道EF中的一个很好的扩展点来实现类似的东西?
我目前正在使用使用GUID作为标识符的模型类.使用EF插入时,它们保留其Guid.Empty初始值.我知道您可以为数据库中的列设置默认值,newid()但这会破坏客户端身份生成的目的.
实体框架是否还不够成熟,无法在分布式,断开连接的系统中使用?
Lad*_*nka 16
不,实体框架代码优先仍然是围绕EFv4的好包装.没有像生成器这样的NHibernate.如果您需要客户端Id生成器,则必须覆盖SaveChanges派生DbContext并实现自己的逻辑,将ID分配给新实体.
编辑:
一些高级示例:
public class Context : DbContext
{
// Helper for example
// DO NOT USE IN REAL SCENARIOS!!!
private static int i = 0;
public DbSet<MyEntity> MyEntities { get; private set; }
public Context()
: base("connection")
{
MyEntities = Set<MyEntity>();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyEntity>().HasKey(e => e.Id);
// Turn off autogeneration in database
modelBuilder.Entity<MyEntity>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(HasDatabaseGeneratedOption.None);
// Other mapping
}
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<MyEntity>()
.Where(e => e.State == EntityState.Added))
{
// Here you have to add some logic to generate Id
// I'm using just static field
entry.Entity.Id = ++i;
}
return base.SaveChanges();
}
}
public class MyEntity
{
public int Id { get; set; }
// Other properties
}
Run Code Online (Sandbox Code Playgroud)
没有.
由NuGet安装的Mine Entity Framework 4.1.10715.也许你可以使用属性
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get;set;}
Run Code Online (Sandbox Code Playgroud)
请在此处查看(EF 4.1中支持的注释的完整列表:CTRL + F).