Составные первичные ключи, которые также являются внешними ключами в Entity Framework - PullRequest
1 голос
/ 14 марта 2009

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

Таблица 1:

  • A (PK, FK - соответствует X в таблице 2)
  • B (PK)
  • C

Таблица 2:

  • X (PK)
  • Y

Поскольку A является как PK в таблице 1, так и FK в таблице 2, когда я использую EF для генерации модели объекта, у меня есть оба свойства Scalar И Navigation для A в таблице 1. Кажется, я не могу удалить A как скаляр (я думаю, потому что это первичный ключ).

Проблема, с которой я столкнулся, заключается в том, что если я создаю table1Entity и устанавливаю скалярное свойство A на новое значение, свойство навигации A не будет изменяться автоматически (и наоборот).

В идеале я просто хочу, чтобы A выставлял свойство навигации - именно так оно и ведет себя, если A все равно не было частью составного первичного ключа. Есть ли способ добиться этого?

Ответы [ 4 ]

1 голос
/ 15 августа 2015

Установили ли вы точные идентификаторы составного ключа и ссылались на них в вашей конфигурации?

т.е.

public class Table1
{
public Table2 A{get;set}
public int AId {get;set;}

public int BId {get;set;}
}

Полагаю, вам понадобится что-то вроде:

HasKey(pc => new { pc.AId, pc.BId});
HasRequired(x => x.A).WithMany().HasForeignKey(x => x.AId);
1 голос
/ 26 января 2012

Ну, не совсем. Создайте представление с привязкой к схеме и создайте кластерный индекс для представления (SQL Server 2008 или более поздняя версия, более ранние версии, я не уверен, что могут это сделать). Кластерный индекс будет распознаваться как первичный ключ, таким образом обманывая EF (VS), полагая, что представление является реальной таблицей.

1 голос
/ 17 марта 2009

Правильно ли я предположить, что Таблица1 происходит из Таблицы2? Если это так, я бы сделал это так:

(я бы также изменил PK для обеих таблиц на одно и то же имя, поскольку они, вероятно, имеют одинаковое значение - для примера я буду использовать идентификатор примера)

  • Сначала создайте модель со связями по умолчанию (я обычно просто импортирую две таблицы из базы данных)
  • В конструкторе щелкните правой кнопкой мыши базовый тип, добавьте наследование, выберите производный тип.
  • Удалить единицу в ноль или одну ассоциацию
  • Затем, поскольку базовый тип уже имеет идентификатор столбца, удалите его из производного типа.
  • Перейдите к отображению таблицы для производного типа и сопоставьте свойство ID с идентификатором таблицы.
0 голосов
/ 19 мая 2010

Вместо непосредственного сопоставления с таблицей 1 добавьте в свою базу данных представление, содержащее все поля таблицы 1, а также дополнительную копию A (A2). Затем сопоставьте скалярный ключ с A2 и навигационную клавишу с A.

(Вы столкнетесь с проблемой, когда при использовании представления Visual Studio не может найти первичный ключ; исправьте это, вручную изменив XML-файл edmx и добавив до для таблицы A)

Я знаю - это нахально и ужасно ... но эй - это работает!

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