Сопоставления свойств в Entity Framework без ПК?

Я попытался создать EF-модель (VS2010, .NET4) с 3 таблицами, каждая таблица с ПК называется Sync_ID.

TABLE_HEAD: (Sync_ID (PK), GRID_ID int, SERIALNUMBER int, YEAR int)

TABLE_POINT: (Sync_ID (PK), GRID_ID int, SERIALNUMBER int, YEAR int, POINT_NUMBER int)

TABLE_PLANT: (Sync_ID (PK), GRID_ID int, SERIALNUMBER int, YEAR int, POINT_NUMBER int, PLANT_NUMBER int)

Ассоциации: TABLE_HEAD "1 ко многим" TABLE_POINT "1 ко многим" TABLE_PLANT

Как вы можете видеть GRID_ID, SERIALNUMBER, ГОД TABLE_HEAD должен быть сопоставлен с GRID_ID, SERIALNUMBER, YEAR TABLE_POINT

И GRID_ID, SERIALNUMBER, YEAR из TABLE_POINT должны быть сопоставлены с GRID_ID, SERIALNUMBER, YEAR,POINT_NUMBER

Мой первый подход заключался в использовании GRID_ID, SERIALNUMBER, YEAR, сгруппированных как PK, но это было бы нарушением Условия.

Таким образом, единственный способ - использовать Sync_ID в качестве PK. Но как можно сопоставить другое поле, как описано выше? Могу ли я только сопоставить PK_Columns?

Надеюсь, у вас есть идеи, чтобы помочь мне. Другие подходы тоже приветствуются. с уважением!

1 ответ

Другой подход - создать правильную структуру базы данных!!!

У тебя есть Sync_ID как PK, так что используйте его как FK в зависимой сущности, вместо того, чтобы создавать беспорядок, который вы описали. Это не имеет ничего общего с правильной архитектурой БД. Задача реляционной базы данных - минимизировать дублирование данных, но вы копируете почти все данные из первой таблицы во все зависимые таблицы. Более того:

  • Если TABLE_HEAD не имеет уникального индекса для GRID_ID, SERIALNUMBER, YEAR это не может быть основной сущностью отношения один-ко-многим
  • Даже если он имеет уникальный индекс, это не имеет значения, потому что EF еще не поддерживает уникальные индексы, поэтому он должен быть первичным ключом для участия в качестве основного субъекта в ассоциации.

Вы должны прочитать кое-что о нормализации базы данных.

Другие вопросы по тегам