我在一家新公司使用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; }
}
答案 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);