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

时间:2011-03-11 16:04:43

标签: c# entity-framework entity-framework-4 ef-code-first

一年前提出的这个问题与此类似: Does the Entity Framework 4 support generators for id values like NHibernate?

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

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

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

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:6)

没有

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

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

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

答案 2 :(得分:-1)

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

然后使用新的GUID ToString

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