实体框架许多多态关系

时间:2015-09-19 10:00:26

标签: c# entity-framework

我需要将与各种实体相关的图像存储在数据库中(按特定顺序排序),其中图像是从中央媒体库中选择的。我正在使用Entity Framework 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属性时该做什么),可以实现这个目的吗?

1 个答案:

答案 0 :(得分: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);