好的,这是我要解决的一个有趣且最重要的真正紧迫的问题...为了让其他人清楚地理解它,我竭尽全力制作了一篇图文并茂的帖子。
对象模型
所以我想到了这个简单、容易且“漂亮”的模型。见第一张图片。 (您可以忽略 PathEntry
,它与我的情况无关。)
这个想法是 MediaFeedItem
拥有:
- 一组
ThumbnailFileEntries
(可通过 ThumbnailFiles 属性访问) - 最多 1 个raw
FileEntry
(MetadataFile 属性)和 - 最多 1 个
MediaFileEntry
(MediaFile 属性)
我们将这最后三种实体类型称为文件实体。
现在还有更多内容:如您所见,我从 FileEntry
继承了 ThumbnailFileEntry
和 MediaFileEntry
,我们不争论了那!(目前),这是设计的故事结尾方面之一,两种实体类型都将在以后继续增长。
这已经给我带来了一些关于从文件实体到MediaFeedItem
的关系引起的多态关联的重要问题。
您应该注意到的第一件事是我已经从派生文件实体(ThumbnailFileEntry
和 MediaFileEntry
) 到主要实体 MediaFeedItem
。
我这样做是因为它们已经继承了基类 FileEntry
中定义的属性。如您所见,我没有删除这些关联末尾的角色。
关系模型
我将使用在概念上非常优越的 TPT 策略来生成我的对象模型并将其映射到 RDB 世界(与 TPH/TPC 相比)。
我正在使用 EF5-rc,EDMX 模型设计器来设计我的模型,并使用 EF5 DbContext 生成器来生成 DbContext 和 POCO,因为我想使用 DbContext API。
如您所见,我可以使用 EF 工具很好地生成数据库模型:
问题
加载新的 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/