0

我在一家新公司使用 CodeFirst,在我的第一次 Code Review 中,我被告知他们不在数据库表中使用 IDENTITY。:(这也让我很难过,但我别无选择。

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

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

    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; }
    }
4

2 回答 2

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();
    }
于 2013-08-20T09:13:24.300 回答
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);
于 2013-06-05T11:55:13.267 回答