Entity Framework: таблица без первичного ключа - PullRequest
154 голосов
/ 22 октября 2010

У меня есть существующая БД, с которой я хотел бы создать новое приложение, используя EF4.0

В некоторых таблицах не определены первичные ключи, поэтому при создании новой модели данных сущностей я получаю следующее сообщение: «В таблице / представлении TABLE_NAME не определен первичный ключ и не может быть выведен действительный первичный ключ. Эта таблица / представление было исключено. Чтобы использовать сущность, вам необходимо просмотреть схему, добавить правильные ключи и раскомментировать ее ".

Если я хочу использовать их и изменять данные, я должен обязательно добавить PK к этим таблицам или есть обходной путь, чтобы мне не пришлось это делать?

Ответы [ 16 ]

104 голосов
/ 05 октября 2011

Я думаю, что это решается Тиллито:

Entity Framework и SQL Server View

Я процитирую его запись ниже:

Мывозникла та же проблема, и вот решение:

Чтобы заставить каркас сущностей использовать столбец в качестве первичного ключа, используйте ISNULL.

Чтобы заставить каркас сущностей не использовать столбец в качестве первичногоключ, используйте NULLIF.

Простой способ применить это состоит в том, чтобы обернуть оператор выбора вашего представления в другой выбор.

Пример:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

ответил 26 апреля'10 в 17:00 от Tillito

63 голосов
/ 22 октября 2010

Ошибка означает именно то, что говорит.

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

Не работай над этим. Исправьте модель данных.

РЕДАКТИРОВАТЬ: Я видел, что некоторые люди отрицательно оценивают этот вопрос. Это нормально, я полагаю, но имейте в виду, что ОП спросил о сопоставлении таблицы без первичного ключа, а не представления . Ответ все тот же. Обходить EF необходимостью иметь PK на таблицах - плохая идея с точки зрения управляемости, целостности данных и производительности.

Некоторые отметили, что у них нет возможности исправить базовую модель данных, поскольку они сопоставляются со сторонним приложением. Это не очень хорошая идея, так как модель может измениться из-под вас. Возможно, в этом случае вы захотите сопоставить с представлением, что, опять же, не то, что спросил ОП.

16 голосов
/ 18 ноября 2016

Составные ключи также можно сделать с помощью Entity Framework Fluent API

public class MyModelConfiguration : EntityTypeConfiguration<MyModel>
{
     public MyModelConfiguration()
     {
        ToTable("MY_MODEL_TABLE");
        HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate });
        ...
     }
}
12 голосов
/ 30 мая 2018

Если я хочу использовать их и изменять данные, я должен обязательно добавить PK к этим таблицам или есть обходной путь, чтобы мне не пришлось это делать?

Для тех, кто отвечает на этот вопрос и использует Entity Framework Core, вам больше не нужно обязательно добавлять PK в эти таблицы или делать обходные пути. Начиная с EF Core 2.1 у нас появилась новая функция Типы запросов

Типы запросов должны использоваться для:

  • Служит типом возврата для специальных запросов FromSql ().
  • Сопоставление с представлениями базы данных.
  • Отображение в таблицы, для которых не определен первичный ключ.
  • Отображение на запросы, определенные в модели.

Итак, в вашем DbContext просто добавьте следующее свойство типа DbQuery<T> вместо DbSet<T>, как показано ниже. Предполагая, что ваше имя таблицы MyTable:

public DbQuery<MyTable> MyTables { get; set; }
6 голосов
/ 05 апреля 2013

ЭТО РЕШЕНИЕ РАБОТАЕТ

Вам не нужно отображать карту вручную, даже если у вас нет ПК.Вам просто нужно сообщить EF, что один из ваших столбцов является индексом, а индексный столбец не имеет значения NULL.

Для этого вы можете добавить номер строки в ваше представление с помощью функции isNull, как показано ниже:

select 
    ISNULL(ROW_NUMBER() OVER (ORDER BY xxx), - 9999) AS id
from a

ISNULL(id, number) является ключевым моментом здесь, потому что он говорит EF, что этот столбец может быть первичным ключом

5 голосов
/ 11 февраля 2014

В моем случае мне пришлось сопоставить сущность с представлением, у которого не было первичного ключа. Более того, мне не разрешили изменять это представление. К счастью, в этом представлении был столбец, представляющий собой уникальную строку. Моим решением было пометить этот столбец как первичный ключ:

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

Обман EF. Работало отлично, никто не заметил ...:)

4 голосов
/ 23 октября 2010

EF не требует первичного ключа в базе данных.Если это так, вы не сможете привязать сущности к представлениям.

Вы можете изменить SSDL (и CSDL), указав уникальное поле в качестве основного ключа.Если у вас нет уникального поля, то я думаю, что вы попали.Но у вас действительно должно быть уникальное поле (и ПК), иначе вы столкнетесь с проблемами позже.

Erick

2 голосов
/ 09 сентября 2016

Это просто дополнение к ответу @Erick T. Если нет единственного столбца с уникальными значениями, обходной путь должен использовать составной ключ следующим образом:

[Key]
[Column("LAST_NAME", Order = 1)]
public string LastName { get; set; }

[Key]
[Column("FIRST_NAME", Order = 2)]
public string FirstName { get; set; }

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

2 голосов
/ 28 августа 2012

Наличие бесполезного идентификационного ключа порой бессмысленно.Я нахожу, если идентификатор не используется, зачем его добавлять?Однако Entity не так уж проста, поэтому лучше всего добавить поле идентификатора.Даже в том случае, если он не используется, это лучше, чем иметь дело с постоянными ошибками Entity по поводу отсутствующего идентификационного ключа.

2 голосов
/ 22 октября 2010

Приведенные выше ответы верны, если у вас действительно нет PK.

Но если он есть, но он не указан с индексом в БД, и вы не можете изменить БД(да, я работаю в мире Дилберта), вы можете вручную сопоставить поле (я) с ключом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...