实体框架5代码优先 - 获取生成ID的功能

时间:2013-06-05 11:35:26

标签: entity-framework ef-code-first

我在一家新公司使用CodeFirst,在我的第一次Code Review中,我被告知他们不在他们的数据库表中使用IDENTITY。 :(这让我伤心过,但我没有任何选择。

我被允许使用一个简单的函数来生成我的ID(然后我将其添加到Key字段的DefaultValue上) - 这在SQL中有效 - 但是CodeFirst只是认为我每次都有一个ID为0

我已经尝试了以下所有内容......有人可以帮忙吗?

    public class Test
    {
        [Key]
        public int ID { get; set; }
    }

    public class Test
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
    }

    public class Test
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ID { get; set; }
    }

    public class Test
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public int ID { get; set; }
    }

2 个答案:

答案 0 :(得分:2)

最后我去了......

    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ID { get; set; }

...然后覆盖数据库上下文的SaveChanges方法以捕获0 ID ...

    public override int SaveChanges()
    {
        var pendingChanges = ChangeTracker.Entries().Where(e => e.State == EntityState.Added && e.Entity is IEntity);
        foreach (var entry in pendingChanges)
        {
            var entity = ((IEntity)entry.Entity);
            if (IsIDGenerated(entity)) continue;
            if (entity.ID == 0) entity.ID = GetNextID(entry.Entity.GetType());
        }
        return base.SaveChanges();
    }

答案 1 :(得分:0)

为什么不简单地使用Guid呢?我不能使用递增id的唯一原因就是当你需要不时地迁移数据库时,Guids非常适合这种情况。

试试这个:

public class Foo {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id {get;set;}
    public string Name {get;set;}
}

或者在Context类中:

modelBuilder.Entity<Foo>().Property(f => f.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);