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

本文关键字:创建 数据库 实体 框架 | 更新日期: 2023-09-27 18:05:53

我有一个代码优先的数据库,具有以下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; }
}

在数据库中创建如下表:

Foo

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表的外键关系。

但是,如果我从Bar中删除DefaultFoo属性,则该外键将被删除。

并且,如果我保留DefaultFoo,但从Foo中删除Bars,从Bar中删除Foos,则该外键被删除。

换句话说,只有当 DefaultFooFoos同时存在于Bar上时,这个外键才存在。

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

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

我猜是:

  • Foo。Bar_BarId是Bar。foo
  • 栏。DefaultFoo_FooId用于Bar。DefaultFoo
  • FooBar表用于Foo。酒吧

我不知道为什么。

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

您可以通过使用linqpad来挑战它,并检查为某些查询生成的sql

我尝试您的模型和结表(FoosBars)没有创建。所创建的列是为21多个Foo创建的。酒吧和酒吧。Bar.DefaultFoo.

我认为在这种情况下,唯一的方法是使用HasMany/WithMany流畅的API配置n-m关系。