Ответ 1
По умолчанию Entity Framework предполагает, что целочисленный первичный ключ является сгенерированной базой данных (эквивалентно добавлению атрибута HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
или вызову Property(e => e.EventID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
в Fluent API.
Если вы посмотрите на миграцию, которая создает таблицу, вы должны увидеть это:
CreateTable(
"dbo.Events",
c => new
{
EventID = c.Int(nullable: false, identity: true),
//etc
})
.PrimaryKey(t => t.EventID );
Затем вы изменили модель с использованием Fluent API до DatabaseGenerated.None
. EF помещает это в миграцию:
AlterColumn("dbo.Events", "EventID", c => c.Int(nullable: false, identity: false))
И созданный sql это:
ALTER TABLE [dbo].[Events] ALTER COLUMN [EventID] [int] NOT NULL
Что на самом деле действительно приседает. Удаление идентификатора из столбца не является тривиальным. Вам нужно отбросить и воссоздать таблицу или создать новый столбец, затем вам нужно скопировать данные и исправить внешние ключи. Поэтому неудивительно, что EF не делает этого для вас.
Вам нужно выяснить, как лучше всего это сделать для себя. Теперь вы можете откатить свои миграции до 0 и повторно заново с нуля, если вы указали DatabaseGeneratedOption.None
, или вы можете вручную изменить миграцию, чтобы удалить и воссоздать таблицу.
Или вы можете удалить и восстановить столбец:
DropColumn("Customer", "CustomerId");
AddColumn("Customer", "CustomerId", c => c.Long(nullable: false, identity: false));
ИЗМЕНИТЬ Или вы можете Включение и выключение идентификации идентификации с помощью пользовательской миграции