a.k.a Как мы можем создать несколько столбцов идентификации в 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; }
}
как мы настроим его так, чтобы:
- Гид автоматически создается базой данных, а не кодом
-
ClusterId
автоинкрементно - Код элемента Entity Framework Сначала не выбрасываются всевозможные ошибки, например:
- Модификации таблиц, в которых столбец первичного ключа имеет свойство "StoreGeneratedPattern", установленное в "Computed", не поддерживается. Вместо этого используйте шаблон "Идентификация".
FYI, если вы хотите автоматически сгенерировать его в коде, вы можете пропустить аннотацию в поле 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();
}
}