2009-03-12 4 views
6

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

В качестве примера, 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?

+0

У нас были те же проблемы здесь, и в конце концов пришлось внести изменения в нашу базу данных, чтобы внешние ключи указывали только на первичные ключи. Невозможно изменить схему базы данных? – CraftyFella

+0

К сожалению, нет - схема - кошмар по старым причинам, и мы должны взаимодействовать с ней. Отстой, я знаю. Как я уже сказал, я видел случаи, когда совершенно правильно иметь как первичный ключ И отдельный (возможно, сложный) внешний ключ. – Rammesses

ответ

3

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

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

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

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

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

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