Entity Framework 4 Code First是否支持像NHibernate这样的身份生成器?

一年前提出的这个问题是类似的: entity framework4是否支持像NHibernate这样的id值的生成器?

但我想知道的是,代码首先是CTP是否增加了对身份生成策略的支持。 如果没有,有没有人知道EF的一个很好的扩展点来实现类似的东西?

我目前正在使用使用GUID作为标识符的模型类。 使用EF插入时,它们保留其Guid.Empty初始值。 我知道您可以将DB中的列的默认值设置为newid()但这会破坏客户端身份生成的目的。

entity framework是否还不够成熟,无法在分布式断开连接的系统中使用?

不,entity framework代码优先仍然是围绕EFv4的好包装。 没有像生成器这样的NHibernate。 如果您需要客户端Id生成器,则必须在派生的DbContext覆盖SaveChanges ,并实现自己的逻辑,将ID分配给新实体。

编辑:

一些高级示例:

 public class Context : DbContext { // Helper for example // DO NOT USE IN REAL SCENARIOS!!! private static int i = 0; public DbSet MyEntities { get; private set; } public Context() : base("connection") { MyEntities = Set(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().HasKey(e => e.Id); // Turn off autogeneration in database modelBuilder.Entity() .Property(e => e.Id) .HasDatabaseGeneratedOption(HasDatabaseGeneratedOption.None); // Other mapping } public override int SaveChanges() { foreach (var entry in ChangeTracker.Entries() .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 } 

没有。

由NuGet安装的Mine Entity Framework 4.1.10715。 也许你可以使用属性

 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id {get;set;} 

请在此处查看(EF 4.1中支持的注释的完整列表:CTRL + F)。

 [Key] public string Id { get; set; } 

然后使用新的GUID ToString

 Units.Add( new Unit(){Id=Guid.NewGuid().ToString(), Name="123"});