一年前提出的这个问题是类似的: Entity Framework 4是否支持ID值生成器(如NHibernate)?
但是我想知道的是,代码优先CTP是否增加了对身份生成策略的支持。如果不是,是否有人知道EF中实现类似功能的良好扩展点?
我目前正在使用使用GUID作为标识符的模型类。使用EF插入时,它们保留其Guid.Empty初始值。我知道您可以将数据库中列的默认值设置为,newid()但这违背了客户端身份生成的目的。
Guid.Empty
newid()
实体框架是否还不够成熟,无法在分布式,断开连接的系统中使用?
不,实体框架代码优先仍然是EFv4的不错包装。没有像NHibernate这样的生成器。如果要使用客户端Id生成器,则必须重写SaveChangesind DbContext并实现将ID分配给新实体的自己的逻辑。
SaveChanges
DbContext
编辑:
一些高级示例:
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 }