【发布时间】:2015-10-06 12:48:42
【问题描述】:
我首先使用 EF6 代码创建数据库,并且正在努力使用联结表创建一对多关系。
这是我正在尝试做的一个示例:
Foo 实体可以包含任意数量 (0-n) 个 Bar 实体,但 Bar 实体不一定属于 Foo。我可能希望不同类型的实体也包含一个或多个Bar,因此Bar 不包含其父级的外键很重要。
所以连接表应该是这样的:
Name | FooBar
------------|-------
Primary Key | BarID
Key | FooID
所以如果我们创建实体如下:
public class Foo
{
public long ID { get; set; }
public ICollection<Bar> Bars { get; set; }
}
public class Bar
{
public long ID { get; set; }
}
然后配置它们:
public class FooConfiguration : EntityTypeConfiguration<Foo>
{
HasKey(p => p.ID);
HasMany(p => p.Bars)
.WithRequired()
.Map(m => {
m.ToTable("FooBar");
m.MapKey("FooKey");
});
}
但这会导致抛出以下异常:
An exception of type 'System.InvalidOperationException' occurred in mscorlib.dll but was not handled in user code. Additional information: The specified table 'FooBar' was not found in the model. Ensure that the table name has been correctly specified.
很遗憾,我不确定这意味着什么 - 我需要创建一个单独的 FooBar 实体吗?
如何配置这些实体以便正确创建连接表?
谢谢!
【问题讨论】:
-
the child entity belongs to many different parent entities如果父母可能有多个孩子,那么您处于多对多关系中,并且 afaik 这是您唯一需要/在 EF 中有联结表的案例 -
我应该更清楚一点 - 子实体被许多不同的实体使用,但这具体是我正在努力创建的一对多子关系。
-
您的意思是孩子可能有也可能没有单亲,但可能与许多类型为 Parent 的实体有(另一个)关系?
-
我用实体名称“父母”和“孩子”混淆了,抱歉。父母可以有 0-n 个孩子,孩子有 1 个父母。但是,我不希望将父级的外键存储在子级上,因为其他实体也有这些子级。我将更改原始问题中实体的名称,以避免混淆父母和孩子的含义。
-
联结表应该至少有 2 列并且仅用于 many-many 关系。所以你需要把这里的关系当作many-many而不是one-many。尝试用
WithMany()替换WithRequired并为联结表映射 2 个键(而不是像您所做的那样只有 1 个)。
标签: entity-framework ef-code-first entity-framework-6 one-to-many