2015-10-07 1 views
17

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

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

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

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

Но если я запускаю команду

PM> Update-Database

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

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

Если изменить PK в моей модели

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

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

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

Я видел более старое сообщение здесь How to make string as primary key in entity framework!.

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

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

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

+0

Ключа дефолта идентичности, так что вам нужно, чтобы выключить его с помощью атрибута '[DatabaseGenerated (DatabaseGeneratedOption.None)] 'Это означает, что вам нужно указать ключ вручную при добавлении (он не сгенерирован). – Hopeless

ответ

29

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

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

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

1

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

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

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

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

+0

Я предполагаю, что его рассуждения были такими же, как мои: вы можете использовать контекстный объект .Find (fooId) od и применять кэширование первого уровня структуры сущности Я использую его для имени пользователя –

Смежные вопросы