aka我们如何在 Code First 中创建多个标识列?
由于集群性能,一个常见的建议是使用自动递增的整数列,而不是使用创建的 GUID newid()
。
为了将列声明为自动增量,您必须使用 Annotation 指定它[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。
但是,您在一个表中只能有一个身份。
所以从一个基本模型开始,比如:
public abstract class ModelBase {
// the primary key
public virtual Guid Id { get; set; }
// a unique autoincrementing key
public virtual int ClusterId { get; set; }
}
我们如何设置它以便:
- Guid由数据库自动生成,而不是代码
ClusterId
是自动递增的- Entity Framework Code First 不会引发各种错误,例如:
- 不支持对主键列的属性“StoreGeneratedPattern”设置为“Computed”的表进行修改。请改用“身份”模式。
仅供参考,如果您确实想在代码中自动生成它,您可以跳过 Id 字段上的注释并执行以下操作:
public abstract class AbstractContext : DbContext {
/// <summary>
/// Custom processing when saving entities in changetracker
/// </summary>
/// <returns></returns>
public override int SaveChanges()
{
// recommended to explicitly set New Guid for appropriate entities -- http://msdn.microsoft.com/en-us/library/dd283139.aspx
foreach (var entry in ChangeTracker.Entries<ModelBase>().Where(e => e.State == EntityState.Added) ) {
// only generate if property isn't identity...
Type t = entry.Entity.GetType();
var info = t.GetProperty("Id").GetCustomAttributes(
typeof(DatabaseGeneratedAttribute), true).Cast<DatabaseGeneratedAttribute>().Single();
if (info.DatabaseGeneratedOption != DatabaseGeneratedOption.Identity) {
entry.Entity.Id = Guid.NewGuid(); // now we make it
}
}
return base.SaveChanges();
}
}