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

Entity Framework: таблица без первичного ключа

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Entity Framework и представление SQL Server

Я приведу его запись ниже:

У нас была та же проблема, и это решение:

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

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

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

Пример:

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

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

Ответ 3

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

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

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

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

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

Ответ 4

Композитные клавиши также могут быть выполнены с API-интерфейсом Entity Framework Fluent

public class MyModelConfiguration : EntityTypeConfiguration<MyModel>
{
     public MyModelConfiguration()
     {
        ToTable("MY_MODEL_TABLE");
        HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate });
        ...
     }
}

Ответ 5

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

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

Эрик

Ответ 6

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

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

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

Ответ 7

Вышеуказанные ответы верны, если у вас действительно нет ПК.

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

Ответ 8

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

Ответ 9

  • Измените структуру таблицы и добавьте первичный столбец. Обновить модель.
  • Измените файл .EDMX в редакторе XML и попробуйте добавить тег нового столбца под эту таблицу (НЕ РАБОТАЕТ)
  • Вместо создания новой таблицы "Первичный столбец в выход" я буду создать составной ключ, объединив все существующие столбцы (РАБОТАЕТ)

Entity Framework: добавление DataTable без основного ключа в модель Entity.

Ответ 10

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

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

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

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

Ответ 11

С практической точки зрения каждая таблица - даже денормализованная таблица, такая как таблица хранилища, должна иметь первичный ключ. Или, в противном случае, он должен, по крайней мере, иметь уникальный, не нулевой индекс.

Без какого-либо уникального ключа в таблице могут отображаться (и будут) повторяющиеся записи, что очень проблематично как для слоев ORM, так и для базового понимания данных. Стол, имеющий дубликаты, вероятно, является симптомом плохого дизайна.

Как минимум, таблица должна иметь хотя бы столбец идентификатора. Добавление столбца автогенерирующего идентификатора занимает около 2 минут в SQL Server и 5 минут в Oracle. Для этого дополнительного усилия можно избежать многих, многих проблем.

Ответ 12

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

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

Ответ 13

Возможно, поздно ответить... однако...

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

Скажите, ваша таблица 1. Записи уникальны: уникальность сделана одним столбцом внешнего ключа: 2. Записи уникальны: уникальность производится комбинацией нескольких столбцов. 3. Записи не уникальны (по большей части *).

Для сценариев # 1 и # 2 вы можете добавить следующую строку в модуль DbContext OnModelCreating: modelBuilder.Entity(). HasKey (x = > new {x.column_a, x.column_b});//столько столбцов, сколько требуется, чтобы сделать записи уникальными.

Для сценария № 3 вы можете использовать вышеупомянутое решение (# 1 + # 2) после изучения таблицы (* что делает все записи уникальными в любом случае). Если вы должны включить ВСЕ столбцы, чтобы сделать все записи уникальными, вы можете захотеть добавить столбец первичного ключа в свою таблицу. Если эта таблица принадлежит стороннему поставщику, чем клонировать эту таблицу в вашу локальную базу данных (в одночасье или столько раз, сколько вам нужно), при этом столбец первичного ключа добавляется произвольно через ваш клон script.

Ответ 14

В таблице просто должен быть один столбец, который не допускает nulls