我有一个代码优先的数据库,包含以下POCO:
public Foo {
public int FooId { get; set; }
public virtual ICollection<Bar> Bars { get; set; }
}
public Bar {
public int BarId { get; set; }
public virtual Foo DefaultFoo { get; set; }
public virtual ICollection<Foo> Foos { get; set; }
}
这将在数据库中创建以下表:
富
FooId (PK, int, not null)
Bar_BarId (FK, int, null)
酒吧
BarId (PK, int, not null)
DefaultFoo_FooID (FK, int, null)
FooBar的
Bar_BarId (PK, FK, int, not null)
Foo_FooId (PK, FK, int, not null)
正如您所看到的,即使Foo
POCO与Bar
POCO没有一对一的导航属性,Foo
表也会获得Bar
表的外键关系{1}} POCO。
但是,如果我从DefaultFoo
删除Bar
属性,则会删除此外键。
并且,如果我离开DefaultFoo
,但从Bars
移除Foo
并从Foos
移除Bar
,则会删除此外键。
换句话说,只有DefaultFoo
上 Foos
和Bar
时才会出现此外键。
如何让实体框架不创建这个不必要的外键(最好不使用FluentApi)?
答案 0 :(得分:0)
我的猜测是:
我不/不能说为什么。
但对我来说,你必须使用一些配置方法来帮助默认行为:流畅或注释来明确设置多/多关系。
你可以通过使用linqpad来挑战它,并检查生成的sql是否有一些查询。
答案 1 :(得分:0)
我尝试你的模型并没有创建Junction表(FoosBars)。创建的列用于2个1-many Foo.Bars和Bar.Foos属性以及1-1 Bar.DefaultFoo。
我认为在这种情况下,唯一的方法是使用HasMany / WithMany fluent API配置n-m关系。 在这种情况下,EF按预期工作。