2015-09-19 347 views
1

我有一個要求,將與各種實體相關的圖像存儲在數據庫中(按特定順序排序),其中圖像是從中央'媒體庫'中選擇的。我正在使用實體框架6訪問數據。實體框架許多多態關係

一般情況是有一個圖像的中央表,用戶可以涉及系統內的各種實體(例如位置可以有圖像,用戶可以有圖像 - 位置可以重新使用用戶使用的相同圖像)。

在我的腦海裏,結構如下。我無法弄清楚實現將看起來像一個實體框架實體佈局。

我已經看過答案如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);