好的,这是一个有趣且最重要的 真正紧迫的问题 需要我解决...为了让其他人能够清楚地理解它,我已经努力制作了一个带有插图的帖子。

对象模型

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

这个想法是 MediaFeedItem 拥有:

  • ThumbnailFileEntries 的集合(可通过 ThumbnailFiles 属性访问)
  • 最多 1 个 原始 FileEntry(元数据文件属性)和
  • 最多 1 个 MediaFileEntry(MediaFile 属性)

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

    现在还有更多:正如您所看到的,我从 ThumbnailFileEntry 继承了 MediaFileEntryFileEntry ,我们不要争论这个! (就目前而言),它是设计的故事结尾方面之一,两种实体类型将在以后继续增长。

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

    您应该观察到的第一件事是,我已将导航属性从 派生的 文件实体( ThumbnailFileEntryMediaFileEntry )消除到主要实体 MediaFeedItem

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



    关系模型

    我将使用如此广泛的概念上优越的 TPT 策略来生成我的对象模型并将其映射到 RDB 世界(vs TPH/TPC)。

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

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



    问题

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

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

    我究竟做错了什么?

    最佳答案

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

    我认为你想要做的是以下之一:

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

  • 我个人认为第二个是解决您的问题的更优雅的解决方案,因为它为您的 MetadataFile 创建了一个实际类型

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

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

    10-12 13:17