一尘不染

Entity Framework 4 Code First是否支持NHibernate等身份生成器?

c#

一年前提出的这个问题是类似的: Entity Framework
4是否支持ID值生成器(如NHibernate)?

但是我想知道的是,代码优先CTP是否增加了对身份生成策略的支持。如果不是,是否有人知道EF中实现类似功能的良好扩展点?

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

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


阅读 331

收藏
2020-05-19

共1个答案

一尘不染

不,实体框架代码优先仍然是EFv4的不错包装。没有像NHibernate这样的生成器。如果要使用客户端Id生成器,则必须重写SaveChangesind
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
}
2020-05-19