Соотношение «многие ко многим» в EF с полем данных в таблице «Связь» - PullRequest
1 голос
/ 08 ноября 2010

Добрый день всем,

У меня есть три таблицы, организованные таким образом, чтобы установить связь «многие ко многим» (Contacts, PurchaseOrder и PO_Contact). Таблица PurchaseOrder в конечном итоге будет представлять каждого покупателя (только один экземпляр каждого). Каждый клиент может быть связан с любым количеством заказов на покупку, а каждый заказ на покупку может быть связан с любым количеством контактов. Однако для каждого контакта может существовать заказ на поставку, который является основным заказчиком для этого контакта.

Я пытаюсь выяснить, как я могу добавить это к моей EntityModel, и у меня не получается. В конце концов я хочу получить коллекцию объектов PO, один из которых обозначен как Primary, но я не уверен, как это сделать. Кто-нибудь имеет опыт работы с этим? Ниже приведена схема базы данных для затронутых таблиц.

Cory

Contact/PO diagram

Contact/PO EDMX Diagram

1 Ответ

1 голос
/ 09 ноября 2010

Что ж, проблема с таблицами соединений состоит в том, что Entity Framework не должен отображать их, если они содержат только FK смежных таблиц, а потому что у вас есть это поле IsPrimary это должно быть представлено на модели.

В конце концов я хочу получить коллекцию объектов PO, один из которых обозначен как Основной

Да, как я уже говорил выше, вам придется физически отобразить таблицу PO_Contact, то есть ваши запросы могут закончиться так:

var contact = db.Contacts.SingleOrDefault(x => x.ContactId == 1);
var ordersForContact = contact.PO_Contacts.PurchaseOrders.ToList();

и это:

var order = db.PurchaseOrders.SingleOrDefault(x => x.POID == 1);
var contactsForOrder = order.PO_Contacts.Contacts.ToList();

Но выяснить, "какой из них первичен"? (и их может быть несколько), вам понадобится другой фильтр.

Это может быть пример запроса:

var primaryOrdersForConactOne = db.Contacts
                                 .Where(c => c.ContactID == 1)
                                 .Where(c => c.PO_Contacts.IsPrimary)
                                 .ToList();

Это должно сработать.

Однако, , если ваш положительный результат может быть только один первичный заказ для любого данного клиента, вы можете установить форму наследования (TPH, TPT) и сделать это поле дискриминатором, так что вы в конечном итоге с отдельные сущности «PrimaryOrder» и «SecondaryOrder», производные от базового класса «PurchaseOrder».

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