【发布时间】:2012-06-04 13:45:11
【问题描述】:
我们有 3 个相互关联的实体:
- Foo 有很多附件
- 栏有很多附件
- 每个附件都可以属于 Foo 或 Bar。
使用DbModelBuilder 对此进行建模的最佳方法是什么?
如果我们尝试:
modelBuilder.Entity<Foo>().HasMany(t => t.Attachments).WithOptional()
.Map(m => m.MapKey("FOO_ID")).WillCascadeOnDelete(true);
modelBuilder.Entity<Bar>().HasMany(t => t.Attachments).WithOptional()
.Map(m => m.MapKey("BAR_ID")).WillCascadeOnDelete(true);
这不是一个非常干净的数据模型: * 附件表将有两个 FK 列,一个用于每个可能的父实体('FOO_ID'、'BAR_ID')。如果我们增加需要附件的实体的数量,它会使表格膨胀。 * 我们需要将后向引用设为可选,尽管附件总是附加到实体上。它不一定是Foo,也不一定是Bar。但是模式将允许所有 FK 设置为 NULL 的附件,尽管从业务视图来看它是无效的。 * 理论上,一个 Attachment 可以同时链接到 Foo 和 Bar,这是无效的。
相反,我们可以将关系映射到联结表“T_FOO_ATTACHMENT”和“T_BAR_ATTACHMENT”: * T_FOO_ATTACHMENT 有一个 必需 Foo (FOO_ID) 外键和一个必需 FK 到 Attachment (ATTACHMENT_ID)。 * T_BAR_ATTACHMENT 也一样
缺点: * 附件仍然可以链接到 Foo 和 Bar。 * 一个附件甚至可以链接到多个 Foo,这也是无效的。理想情况下,我们可以使用流畅的语法来添加防止这种情况发生的数据库约束。
【问题讨论】:
标签: entity-framework-4.1 ef-code-first fluent-interface