防止实体框架在数据库中创建外键

时间:2016-09-06 09:15:24

标签: c# .net entity-framework entity-framework-6

我有一个代码优先的数据库,包含以下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 FoosBar 时才会出现此外键。

如何让实体框架创建这个不必要的外键(最好不使用FluentApi)?

2 个答案:

答案 0 :(得分:0)

我的猜测是:

  • Foo.Bar_BarId适用于Bar.Foos
  • Bar.DefaultFoo_FooId适用于Bar.DefaultFoo
  • FooBar表适用于Foo.Bars

我不/不能说为什么。

但对我来说,你必须使用一些配置方法来帮助默认行为:流畅或注释来明确设置多/多关系。

你可以通过使用linqpad来挑战它,并检查生成的sql是否有一些查询。

答案 1 :(得分:0)

我尝试你的模型并没有创建Junction表(FoosBars)。创建的列用于2个1-many Foo.Bars和Bar.Foos属性以及1-1 Bar.DefaultFoo。

我认为在这种情况下,唯一的方法是使用HasMany / WithMany fluent API配置n-m关系。 在这种情况下,EF按预期工作。