实体框架多-多态关系
本文关键字:多态 关系 框架 实体 | 更新日期: 2023-09-27 18:13:22
我需要在数据库中存储与各种实体相关的图像(按特定顺序排序),其中图像是从中央'媒体库'中选择的。我正在使用实体框架6访问数据。
一般情况是有一个中央的图像表,用户可以将其与系统内的各种实体相关联(例如,位置可以有图像,用户可以有图像-一个位置可以重用用户使用的相同图像)。
在我的脑海中,结构如下:我有麻烦弄清楚什么实现看起来像一个实体框架实体布局。
我看过答案,如实体框架多态关联(表-每类型?),但他们似乎采取连接EntityWithMedia1和EntityWithMedia2的方法,所以它们与父表相关,但这种情况并不真正适合这种方法在我看来(例如,这两个实体碰巧都包括媒体,但应该在DB结构方面保持完全独立)。
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属性)?
当您想要连接没有物理关系的对象(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);