防止实体框架在数据库中创建外键
本文关键字:创建 数据库 实体 框架 | 更新日期: 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
,则该外键被删除。
换句话说,只有当 DefaultFoo
和Foos
同时存在于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关系。