2011-03-11 54 views
11

这个问题,问一年前,是相似的: Does the Entity Framework 4 support generators for id values like NHibernate?Entity Framework 4 Code First是否支持像NHibernate这样的身份生成器?

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

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

是实体框架只是不够成熟的分布式,断开连接的系统中使用?

+0

好问题.. – 2011-03-11 16:05:56

+4

的EntityFramework 4.0是从1.0前进了一大步,但它仍然是另一半烤微软执行。可扩展性指向几乎没有。 – Jeff 2011-03-11 16:07:01

+1

@Jeff,虽然我很欣赏你的意见(我的是相似的,我更喜欢NH),对于这个特殊的项目,我没有使用别的余地。 – joshperry 2011-03-11 16:08:51

回答

16

没有,实体框架代码优先仍然是围绕EFv4刚刚好包装。没有像生成器那样的NHibernate。如果你想客户端ID生成器,你将不得不覆盖衍生DbContextSaveChanges和实现自己的新实体将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 
} 
+3

...这将是几行代码,上衣。 – 2011-03-11 21:39:47

+0

完美(解决方法),谢谢拉迪斯拉夫。 – joshperry 2011-03-11 22:05:34

+0

听起来很有意思,关于如何实现它的任何指针? (如何获得新实体,如何防止EF分配ID等) – 2011-03-12 10:35:40

6

矿实体框架4.1.10715通过的NuGet安装。 也许你可以使用属性

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

请参阅(EF的4.1支持批注的完整列表:CTRL + F页)here

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

,然后使用新的GUID的ToString

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