c# - Entity Framework 上的多态交叉关联

标签 c# .net entity-framework orm polymorphic-associations

好的,这是我要解决的一个有趣且最重要的真正紧迫的问题...为了让其他人清楚地理解它,我竭尽全力制作了一篇图文并茂的帖子。


对象模型

所以我想到了这个简单、容易且“漂亮”的模型。见第一张图片。 (您可以忽略 PathEntry,它与我的情况无关。)

这个想法是 MediaFeedItem 拥有:

  • 一组 ThumbnailFileEntries(可通过 ThumbnailFiles 属性访问)
  • 最多 1 个raw FileEntry(MetadataFile 属性)和
  • 最多 1 个 MediaFileEntry(MediaFile 属性)

我们将这最后三种实体类型称为文件实体

现在还有更多内容:如您所见,我从 FileEntry 继承了 ThumbnailFileEntryMediaFileEntry我们不争论了那!(目前),这是设计的故事结尾方面之一,两种实体类型都将在以后继续增长。

EDMX Model Diagram

这已经给我带来了一些关于从文件实体MediaFeedItem的关系引起的多态关联的重要问题。

您应该注意到的第一件事是我已经从派生文件实体(ThumbnailFileEntry MediaFileEntry) 到主要实体 MediaFeedItem

MediaFeedItem_MediaFile association

我这样做是因为它们已经继承了基类 FileEntry 中定义的属性。如您所见,我没有删除这些关联末尾的角色。

MediaFeedItem_MetadataFile association


关系模型

我将使用在概念上非常优越的 TPT 策略来生成我的对象模型并将其映射到 RDB 世界(与 TPH/TPC 相比)。

我正在使用 EF5-rc,EDMX 模型设计器来设计我的模型,并使用 EF5 DbContext 生成器来生成 DbContext 和 POCO,因为我想使用 DbContext API。

如您所见,我可以使用 EF 工具很好地生成数据库模型:

DB Model Diagram


问题

加载新的 MediaFeedItem 并保存它时,出现以下错误:

System.InvalidOperationException:违反多重约束。关系“MediaFeedModel.MediaFeedItem_MetadataFile”的角色“MetadataFile”具有多重性 1 或 0..1。

我做错了什么?

最佳答案

看看你的问题,有一件事很突出,文件和 MediaFeedItem 之间的 FK 关系是必需的(IE 文件必须有一个 MediaFeedItem),但如果你在文件的扩展版本中,你可能不想要这个。

我想你想做的是以下之一:

  • 将 MediaFeedItem_FileEntry 的多重性更改为 0..1 - 0..1,这样两端都不需要它
  • 创建一个新的扩展类型来处理您的 metadataFile 类型并删除基本类型和 MediaFeedItem 之间的直接引用

我个人认为第二个是解决您问题的更优雅的方法,因为它为您的元数据文件创建了一个实际类型

似乎正在发生的事情是您正在尝试创建扩展类型,但基本类型实际上不是元数据文件。

关于c# - Entity Framework 上的多态交叉关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11270620/

相关文章:

.net - ASP.NET "Yellow Screen of Death"如何显示代码?

c# - 如何构建 Windows 窗体电子邮件感知文本框?

c# - "fix" "dynamic"IEnumerable 是否有规范的方法?

.net - IIS8.5 设置HTTPS网站间跨域可用

c# - 将 BitmapImage 转换为位图,反之亦然

c# - 我如何使用方法而不是硬编码(使用 Entity Framework )向实体添加属性?

asp.net-mvc - 使用EF连接现有数据库

c# - Entity Framework 连接向导找不到我的数据库

c# - 将 foreach 循环更改为 lambda

c# - Enumerable.ToList() 是否有惩罚