Сопоставления свойств в 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 еще не поддерживает уникальные индексы, поэтому он должен быть первичным ключом для участия в качестве основного субъекта в ассоциации.
Вы должны прочитать кое-что о нормализации базы данных.