Подтвердить что ты не робот

Как использовать свойство String в качестве первичного ключа в Entity Framework

Я новичок в EF и стараюсь сделать первые шаги с помощью первого подхода кода в ETF6.0, и теперь у меня есть проблема.

У меня есть свойство

[Key]
public string FooId { get; set; }

который является моим основным ключом для модели.

Но если я запустил

PM > Обновление базы данных

в консоли диспетчера пакетов для обновления ожидающих миграций в базе данных, я получаю следующую ошибку:

Столбец "FooId" должен иметь тип данных int, bigint, smallint, tinyint, или десятичный или числовой, с шкалой 0, и ограничивается быть невыполнимым.

Если я изменю PK в моей модели на

[Key]
public int FooId { get; set; } 

все работает нормально.

Но мне понадобится, чтобы PK был типа string, потому что в моем случае он абсолютно чувствует. Я знаю, что есть недостатки, но для меня это необходимо.

Я видел более старое сообщение здесь Как сделать строку в качестве первичного ключа в структуре сущности!.

Но это, кажется, не решает мою проблему, или я просто не понимаю.

Неужели я не могу использовать строку как PK в базе данных SQL?

Или есть способ сделать это?

4b9b3361

Ответ 1

Это правильный способ создания ПК без использования автоопределения Identity:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string FooId { get; set; }

Ответ 2

Если вам нужен ваш первичный ключ, чтобы он был строкой, не делайте его столбцом идентификации. Столбцы идентификаторов будут генерировать значения первичного ключа для вас, которые вы должны отключить, если вы намерены сами создавать значения.

Ответ 3

В чем причина того, что в качестве первичного ключа есть строка?

Я бы просто установил первичный ключ в поле auto incrementing integer и поместил индекс в поле строки.

Таким образом, если вы выполняете поиск в таблице, они должны быть относительно быстрыми, и все ваши соединения и обычные поисковые запросы не будут затронуты в их скорости.

Вы также можете контролировать количество строкового поля, которое индексируется. Другими словами, вы можете сказать "только индексировать первые 5 символов", если вы считаете, что этого будет достаточно. Или, если ваши данные могут быть относительно похожими, вы можете проиндексировать все поле.