Код структуры Entity Framework Сначала используйте Guid как идентификатор с другой колонкой Identity
aka Как мы можем создать несколько столбцов идентификации в Code First?
Из-за производительности кластеров общая рекомендация заключается в том, чтобы использовать столбец с автоинкрементным целым числом вместо GUID, созданного с помощью функции newid()
.
Чтобы объявить столбец как автоинкремент, вы должны указать его с помощью annotations [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
.
- Как передать параметры методу DbContext.Database.ExecuteSqlCommand?
- Как включить EF-миграции для разных контекстов для разделения баз данных?
- свойство навигации должно быть виртуальным - не требуется в ef core?
- Установка значения по умолчанию для свойства DateTime в DateTime.Now внутри значения System.ComponentModel Default Attrbute
- Как я могу запросить нулевые значения в структуре сущностей?
Но вы можете иметь только одно удостоверение в таблице.
Итак, начиная с базовой модели, например:
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 Code Сначала не генерирует всевозможные ошибки, например:
- Модификации таблиц, в которых столбец первичного ключа имеет свойство «StoreGeneratedPattern», установленное в «Computed», не поддерживается. Вместо этого используйте шаблон «Идентичность».
FYI , если вы хотите автоматически генерировать его в коде, вы можете пропустить аннотацию в поле Id и сделать что-то вроде:
public abstract class AbstractContext : DbContext { /// /// Custom processing when saving entities in changetracker /// /// 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().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().Single(); if (info.DatabaseGeneratedOption != DatabaseGeneratedOption.Identity) { entry.Entity.Id = Guid.NewGuid(); // now we make it } } return base.SaveChanges(); } }
- Место для размещения Database.SetInitializer
- Создание поля First Date Framework
- Улучшать имена свойств навигации при обратном проектировании базы данных
- Entity Framework с NOLOCK
- Установите десятичное значение (16, 3) для столбца в первом подходе кода в EF4.3
- Рамификации DbSet.Create против нового объекта ()
- Связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не имеют значения NULL
- Как разогревать приложение ASP.NET MVC на IIS 7.5?
Это закончилось для меня, Entity Framework 5.
- Отключить автоматическую миграцию
- Миграция для создания исходной таблицы, без излишеств
-
Объявить
ClusterId
как идентификатор (аннотация)[DatabaseGenerated(DatabaseGeneratedOption.Identity)] public override int ClusterId { get; set; }
-
мигрировать
-
Объявить
Id
свойства pk как идентификатор после того, как он был обновлен[DatabaseGenerated(DatabaseGeneratedOption.Identity)] public override Guid Id { get; set; }
- бонус : EF, похоже, предполагает, что
Id
является первичным ключом, поэтому вам не нужно[Key, Required]
- бонус : EF, похоже, предполагает, что
-
Создайте код миграции, например
add-migration TrickEfIntoAutogeneratingMultipleColumns
- В методе
Up()
вAlterColumn
сообщите базе данных, чтобы автогенерировать GUID, объявивdefaultSqlValue
-
AlterColumn(theTable, "Id", c => c.Guid(nullable: false, identity: true, defaultValueSql: "newid()"));
-
- мигрировать
Это похоже на «трюк» EF, в том смысле, что он предполагает, что оба столбца являются тождествами и реагируют соответственно. Во время миграции он пытается сделать другой столбец личным, но, похоже, не волнует, когда это тихо проваливается – в итоге вы попадаете в один символ с именем Identity, а другой – по умолчанию.
Во время нормальной работы кода, когда EF проходит шаги SaveChanges / ChangeTracking, поскольку он видит свойство Id
как идентификатор, он делает это «назначить временный ключ» , чтобы он не пытался использовать значение по умолчанию 0000000 …, и вместо этого позволяет генерировать базу данных с использованием указанной вами функции значений по умолчанию.
(Я бы подумал, что аннотировать это поле, поскольку Computed
выполнил бы то же самое, но … ошибки, о которых я упомянул в вопросе … boo …)
И поскольку поле ClusterId
также является идентификатором в коде и действительно является идентификатором в базе данных, оно также ClusterId
.