【问题标题】:Prevent Entity Framework from creating foreign key in database防止实体框架在数据库中创建外键
【发布时间】:2016-09-06 09:15:24
【问题描述】:

我有一个包含以下 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 表获得了与Bar 表的外键关系,即使Foo POCO 没有与Bar POCO 的一对一导航属性。

但是,如果我从 Bar 中删除 DefaultFoo 属性,则会删除此外键。

而且,如果我将DefaultFoo 留在其中,但从Foo 中删除Bars 并从Bar 中删除Foos,则此外键将被删除。

换句话说,只有当DefaultFooFoos 都出现在Bar 上时 才会出现这个外键。

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

【问题讨论】:

  • 您能描述一下您想要实现的目标吗?在 Bar 上拥有 Multiple-和 Single- Foo 属性对我来说没有意义。此外,通过给 Bar 一个 Foo 类型的属性,您可以在这些类上建立一对一的关系。
  • 您可以尝试在 Bar 类中添加public in SingleFooId{get;set}; 并装饰导航属性[ForeignKey("SingleFooId")]public virtual Foo SingleFoo { get; set; }
  • @J.Swietek 一个Bar可以有多个Foo,但其中一个Foos 是默认值。这样当Bar 上有许多Foos 时,如果没有特别指定,您就知道使用哪一个。我已将模型编辑为默认而不是 Single 以(希望)使其更清晰。

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


【解决方案1】:

我的猜测是:

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

我不/不能说为什么。

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

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

【讨论】:

    【解决方案2】:

    我尝试了您的模型,但未创建连接表 (FoosBars)。创建的列用于 2 1-many Foo.Bars 和 Bar.Foos 属性以及 1-1 Bar.DefaultFoo。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 2018-08-14
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多