Вопрос

Это более или менее общий вопрос, а не о каком -либо конкретном ORM или языке, в частности: этот вопрос возникает независимо от ваших предпочтений ORM.

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

Рассмотрим следующие таблицы:

CaseWorker (id, first_name, last_name)
CaseWorkerCases (case_worker_id, case_id, date_opened, date_closed)
Case (id, client_id, field_a, field_b)

Как программист, я бы действительно мог бы сделать:

CaseWorker.Cases

чем

CaseWorker.CaseWorkerCases.Cases

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

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

public IEnumerable<Case> Cases
{
    get{return (from caseWorkerCase in this.CaseWorkerCases
                select caseWorkerCase.Case);}
}

Но это также кажется неправильным.

Это было полезно?

Решение

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

У меня есть сообщение в блоге об этой точной теме: Многие ко многим отношениям со свойствами

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top