实体框架多-多态关系

本文关键字:多态 关系 框架 实体 | 更新日期: 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);