又名我们如何创造的Code First多重身份列?
因为聚类性能的,常见的建议是使用自动递增的整数列,而不是用创建的GUID的newid()
。
为了声明一个列自动增量,你必须与注释指定它[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
是自动增量 - 实体框架代码首先不抛出各种类似的错误:
- 修改表的其中一个主键列具有属性“StoreGeneratedPattern”设置为“计算”不被支持。 使用“身份”而不是模式。
仅供参考 ,如果你想在代码自动生成它,你可以跳过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();
}
}