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