Как обрабатывать «вторичные» ключи в Entity Framework - PullRequest
6 голосов
/ 12 марта 2009

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

В качестве примера, foo может иметь множество bars, как определено так (простите за псевдокод):

table foo {
  int foo\_id pk,
  char(10) foo\_code,
  ...
}

table foobar {
  int bar\_id pk,
  char(10) bar\_foo\_code fk(foo.foo\_code),
  ...
}

Чего мне не хватает, чтобы создать foo_foobar ассоциацию и, следовательно, Bars свойство навигации для Foo сущности?

1 Ответ

3 голосов
/ 12 марта 2009

Linq для сущностей не поддерживает внешние ключи, которые не указывают на первичный ключ таблицы (см. Сообщение в журнале 3). Линк к объектам будет рассматривать его как обычное поле таблицы. Вы не сможете перейти к объекту, с которым он связан.

Если у вас есть существующая схема, я бы порекомендовал использовать генератор edm , поскольку это создаст файл EMDX, код и даже код представления (который может быть очень большим). Если ваша существующая схема достаточно велика Проверьте этот пост , в котором объясняется, как обращаться с большими схемами.

Когда вы запустите генератор EDM, вы обнаружите все, что не поддерживается.

Глядя на предыдущий журнал EDMGen2.exe, мы получили следующие типы сообщений:

  1. Тип данных 'sql_variant' не
    поддерживается, столбец 'ColumnName' в таблице TableName было исключен.
  2. Таблица / представление 'tableName' не имеет иметь первичный ключ, определенный. Ключ был сделан вывод и определение была создана как таблица только для чтения / представление
  3. Отношение 'RelationshipName' имеет столбцы, которые не являются частью ключ стола на первичная сторона отношений который не поддерживается, отношения были исключены.

Мы также обнаружили, что проект Linq на самом деле очень сильно зависал в Visual Studio, поскольку файл кода, созданный EDM, занимал более 80 МБ.

...