1

Я видел много сообщений и ответов о том, как пометить поле как столбец идентичности. Многие из них устарели и ориентированы на более старые версии Entity Framework.Как правильно помечать столбцы идентификаторов с помощью Entity Framework 6.1?

Некоторые ресурсы говорят мне использовать атрибут на поле:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int ID { get; set; } 

Другие ресурсы говорят мне, чтобы добавить этот код в OnModelCreating метод:

modelBuilder.Entity<User>().Property(u => u.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); 

Какой я должен использовать? Во-первых, во-вторых, и то, и другое, не имеет значения, или что-то еще?

+0

Либо, ваш выбор. Я использую смесь из двух: атрибутов для простых вещей, подобных этому, и «modelBuilder» для более сложных сценариев, которые атрибуты не покрывают. Они оба одинаково важны, и вы увидите, что под обложками (соглашения EF) атрибуты используются, чтобы сказать 'modelBuilder', что делать. – Amy

+0

@ Ами спасибо. Я думаю, что я возьму подход атрибутов, поскольку он дает более чистый код. Не могли бы вы оставить свой комментарий в качестве ответа, чтобы я мог его принять? –

+0

Является ли это свойство основным ключом? – CodeNotFound

ответ

2

До тех пор, пока тип свойства первичного ключа является числовым или GUID, Code First, по соглашению, автоматически настраивает ключ как столбец идентификатора.

Это означает, что вам не нужно иметь какую-либо конфигурацию, которую вы поместили в свой код, чтобы явная эксплоитность задала свойство как столбец идентификатора, потому что Code First уже использует для этого заголовок. Атрибут аннотации данных или текущие конфигурации API, которые вы установили, бесполезны.

Эти конфигурации используются для первичного ключа с числовым или GUID-типом, только если вы хотите отключить идентификатор.

+0

Не знал об этом. Приятно видеть, что я не нуждаюсь ни в одном из них. –

+0

Добавление в @CodeNotFound, Entity Framework Code Сначала можно использовать соглашение о конфигурации. Конвенция должна называть ваши столбцы Identity идентификаторами, идентификаторами, MyClassNameId или MyClassNameID, а Entity Framework будет работать с вами, или вы используете конфигурацию, в которой вы явно указываете, что вы хотите, чтобы EF Code First работал с вашей моделью, например, добавить DataAnnotations и с использованием конфигурации Fluent API. И вы можете смешивать и сопоставлять соглашения и конфигурации на одной и той же модели. –

0

Любой, ваш выбор. Я использую смесь из двух атрибутов для простых вещей, подобных этому, и для modelBuilder для более сложных сценариев, которые атрибуты не покрывают. Они оба одинаково важны, и вы увидите, что под обложками (соглашения EF) атрибуты используются, чтобы сообщить modelBuilder, что делать.

1

Это для тех, кто потерял более двух часов по этому вопросу.

Я допустил ошибку, отметив столбец как KEY, что позже я понимаю, что это не ключ, а только столбец.

У моей модели были зависимости, поэтому я не мог просто удалить атрибут KEY и пусть это будет. Столбец Идентификатор по умолчанию никогда не получал как столбец идентификаторов на SQL Server, либо после создания соответствующей миграции и настройки: идентификация как истина.

Вместо этого мне пришлось удалить Dbset из контекста, удалить все ссылки на него и из него в другие объекты. И создайте миграцию, которая отбрасывает таблицу, а затем фиксирует модель. Убедитесь, что все в порядке. И затем создавая хорошо продуманную модель, подключая все зависимости обратно.

Это была моя ошибка из первых рук. Поэтому у меня нет тела, чтобы винить себя.

Надеюсь, что в эту ситуацию еще никто не придет, но если это произойдет, это то, что я сделал.