Модель Entity Framework и свойство внешнего ключа - PullRequest
3 голосов
/ 02 мая 2010

У меня есть 2 таблицы, которые я импортирую в модель EF.
Первая таблица имеет свойство [section], которое действует как внешний ключ ко второй таблице. Когда я сопоставляю это свойство в модели с таблицей и пытаюсь скомпилировать, я получаю эту ошибку:

Проблема с отображением фрагментов в строках 158, 174: не первичный ключ столбцы (разделы) отображаются в обоих фрагментах к разным концептуальные побочные свойства - данные несоответствие возможно, потому что соответствующая концептуальная сторона свойства могут быть независимо модифицировано.

Если я удаляю это свойство из модели, оно проходит, но когда я запрашиваю данные, у меня нет поля раздела.

Я знаю, что могу получить его, используя поле навигации и читая это свойство из второй таблицы, но чтобы это работало, я должен включить другую таблицу в свой запрос.

var res  = from name in Context.Table1.Include("Table2")...

Почему мне нужно включить ассоциацию только для одного поля?

UPDATE
Чтобы было понятнее:

В таблице 1 есть поля:
ItemId - ключ
раздел - внешний ключ
название

В таблице 2 есть поля:
SectionId - ключ
Имя

Когда я устанавливаю ассоциации, свойство раздела из первой таблицы должно быть удалено.

Ответы [ 2 ]

1 голос
/ 03 мая 2010

Каковы ваши основные ключи и генерируется ли один магазин? Я подозреваю, что вам не хватает ПК или удостоверения где-то.

Совет: Одна из альтернатив при возникновении проблем с отображением - это создать нужную модель в конструкторе EDMX, а затем попросить ее создать базу данных для вас. Сравните то, что он создает, с тем, что вы сделали в SQL, и часто легко обнаружить ошибки.

0 голосов
/ 03 мая 2010

В EF 4 вы можете использовать FK ассоциаций для этого.

В EF 1 самый простой способ получить одно поле из связанной таблицы - это проецировать:

var q = from t1 in Context.Table1
        where //...
        select new 
        {
            T1 = t1,
            Section = t1.Section.SectionId
        };
var section = q.First().Section;

Если это ключевое свойство, вы можете получить значение через EntityKey:

var t1 = GetT1();
var section = (int)t1.SectionReference.EntityKey.Values[0].Value;

Как правило, мне не нравится этот последний метод. Он слишком специфичен для EF и завершается ошибкой, если ваш запрос MergeOption установлен на NoTracking.

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