2015-09-19 4 views
1

У меня есть требование хранить изображения, связанные с различными объектами в базе данных (отсортированные в определенном порядке), где изображения выбраны из центральной медиа-библиотеки. Я получаю доступ к данным с Entity Framework 6.Entity Framework Много-много полиморфных отношений

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

В моей голове структура, как показано ниже. Мне трудно понять, что реализация будет выглядеть как макет объекта Entity Framework.

Я рассмотрел такие ответы, как Entity Framework Polymorphic associations (Table-Per-Type?), Но они, похоже, используют подход EntityWithMedia1 и EntityWithMedia2, поэтому они связаны с родительской таблицей, но эта ситуация на самом деле не дает на мой взгляд (например, два объекта, как правило, включают медиа, но должны оставаться полностью разделенными по структуре БД).

Media { 
     ImageId (int) 
     ImageName (string) 
     ImageFileName (string) 
     RelatedEntities (list) // Queries RelatedMedia table 
} 

RelatedMedia { 
     ImageId (int) 
     EntityWithMediaId (int) // Actual Id of the Entity to be used with Type below 
     EntityWithMediaType (string) // In my head this says 'SomeEntity1' or some other ID such as a guid defined on the entity in c# (the 'Laravel approach') 
     SortOrder (int) 
} 

SomeEntity1 { 
     SomeEntity1Id (int) 
     EntityName (string) 
     SomeProperty (int) 
     RelatedMedia (list) // Queries RelatedMedia table 
} 

SomeEntity2 { 
     SomeEntity2Id (int) 
     EntityName (string) 
     AnotherProperty (string) 
     RelatedMedia (list) // Queries RelatedMedia table 
} 

Если это не поддерживается из коробки, есть много возможностей для реализации этого пути расширения EF (например, написать свой собственный запрос, так EF знает, что делать, когда я пытаюсь использовать RelatedEntities/свойства RelatedMedia)?

ответ

0

Если вы хотите присоединиться к объектам, которые не имеют физического отношения (SomeEntity1/RelatedMedia), вам нужно написать предложение о соединении, используя ключевое слово join.

Например:

var query = 
    from media in context.RelatedMedias 
    join entity in context.Entities on media.EntityWithMediaId equals entity.SomeEntityId 
    where entity.EntityWithMediaType == "EntityType" 
    select new { Media = media, Entity = entity }; 

Если вы хотите загрузить для конкретного объекта:

var entity; 
var medias = context.RelatedMedias.Where(i => i.EntityWithMediaType == "EntityType" && i.EntityWithMediaId == entity.EntityId); 
Смежные вопросы