2013-06-20 3 views
1

Я знаю, что это повторяющийся вопрос, и я знаю, что это невозможно, если в таблице «в середине» есть дополнительные свойства.EF От многих до многих отношений с дополнительными свойствами

У меня возникла идея, как получить эффект отношения m: N вместо 1: n-n-1, но я хотел бы услышать другие мысли.

Если у меня есть три объекта, A, B и AB, где AB делает возможным отношение A: B и обладает дополнительными свойствами.

Используя Databasefirst подход, я думал сделать частичный класс A и B.

public partial Class A 
{ 
    public IEnumerable<EntityObject> Bs 
    { 
     get 
     { 
      return this.Select(p=>p.AB.B); 
     } 
     set { //... } 
    } 
} 

Может что-то подобное возможно.

Просто рисовать в моей голове. Я сейчас в отпуске и не имею компьютера, поэтому это не проверено, а просто написано на моем мобильном телефоне.

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

Любые мысли?

+0

Почему вы не разлагаете много-много-много, которые вы получаете автоматически с помощью 'ICollection' в каждом объекте и создаете свой собственный средний объект, который имеет прямую ссылку на каждый из других объектов плюс дополнительные свойства? Я делал это только для m-2-m, прежде чем понял, что EF может сделать это за вас. –

+0

Я не уверен, что вы имеете в виду. В настоящее время у меня есть объекты A-AB-B. Не могли бы вы объяснить более подробно то, что вы имеете в виду? – user853710

+1

Вы можете вручную определить объект AB, который имеет одну ссылку на A и B (таким образом, генерируя m-2-m). A будет иметь список AB, а B будет иметь список AB. Затем вы можете поместить то, что вам нравится, на AB, поскольку вы контролируете сущность. Это с точки зрения кода. –

ответ

1

Если вы уже лечение AB в качестве отдельного объекта, а затем, чтобы получить все B от А все, что вам нужно что-то вроде этого:

public partial class A 
{ 
    public IQueryable<B> Bs { 
     get { return this.ABs.AsQueryable().Select(ab => ab.B).Distinct(); } 
    } 
} 

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

1

Если технически возможно или нет, выражая такое отношение с «дополнительных свойств в среднем столе», то отношения «многие-ко-многим» просто неправильны, поскольку он скрывает, что «средняя таблица» имеет деловое значение и, следовательно, должен быть субъектом сам по себе.

Несколько классического пример такой модели является RawMaterial и Product: а RawMaterial может быть использован в нескольких Product с и Product может быть изготовлен из нескольких RawMaterial с. Сущность между ними - возможно, называется RecipePart - содержит Quantity, сколько штук данного RawMaterial используется в заданном Product.

Если у вас есть, например, продукт ChocolateBar и работа с его отношением к сыри вы будете иметь дело с рецептом, который говорит ChocolateBar имеет 60 единиц Chocolate и 40 единиц Milk, т.е. ChocolateBar имеют коллекцию RecipePart с и каждый RecipePart описывает количество и относится к соответствующему RawMaterial. A ChocolateBarне имеют прямую коллекцию RawMaterial s в этой бизнес-модели.

Для конкретного запроса (может быть, некоторых статистических данных) вас могут интересовать только его сырьевые материалы: шоколад и шоколад делают шоколад и молоко независимо от количества единиц, но это особый запрос в вашей бизнес-модели и вид агрегации, которая игнорирует некоторые части полной подробной информации о модели. Это то, что делает ваше вспомогательное свойство this.Select(p=>p.AB.B);: оно не выражает полное отношение, но является специализированным запросом, который говорит: Дайте мне только RawMaterial s для этого Product, я не хочу знать каждое количество.

Характерно, что у вас есть свойство setter set { //... } заглушки. При добавлении или изменении объектов становится очевидным, что отношения не могут быть много-ко-многим. Невозможно назначить только RawMaterial с Product.Вы должны добавить информацию о том, сколько единиц каждого RawMaterial получить действительную модель Product, что означает, что Product должен быть связан с «средним лицом» RecipePart.

+0

Я абсолютно с тобой согласен. Скрытие среднего стола - это вздор. Необходимо. То, что я пытаюсь достичь, - это нечто иное. Я не хочу потерять средний стол. Я хочу это. Я пытаюсь иметь простой способ манипулировать entrie в B от объекта в A так, как скрывается средний объект. Повторяю, я не хочу потерять объект AB. Я просто хочу подражать, как будто он был скрыт. – user853710

Смежные вопросы