【问题标题】:Why do Code First classes need navigation properties?为什么 Code First 类需要导航属性?
【发布时间】:2012-08-22 18:05:11
【问题描述】:

我有一些看起来像这样的域类,我想使用 Code First 进行建模(在 EF 4.3 中)。

public class Foo {
    // ...
}

public class Bar {
    // ...

    public Foo Foo { get; set; }
}

public class Baz {
    // ...

    public Foo Foo { get; set; }
}

在我看到的每个example 中,外部对象引用都添加到Foo 类中。我的Foo 类可以与Bar 和Baz 类无关,还是我真的需要做这样的事情?

public class Foo {
    // ...
    public virtual Bar { get; set; }

    public virtual Baz { get; set; }
}

根据this answer,类确实需要有导航属性。我是 Code First 的新手,所以谁能解释为什么会这样?有没有办法通过使用 Fluent API 避免像这样污染我的 Foo 类?

Foo 需要了解每个使用它的类,这对我来说似乎很奇怪。我的设计在某些方面是否存在根本性缺陷?

【问题讨论】:

    标签: c# .net entity-framework ef-code-first


    【解决方案1】:

    您的问题将是一对一关系的要求。 EF 中的一对一关系通过主键映射。您选择主体实体,从属实体的 PK 必须具有 FK - 它们必须具有相同的 PK 值才能相关。原因是缺少对唯一键的支持。

    一旦你接受了这个限制,你就可以简单地使用你的模型并像这样映射它:

    modelBuilder.Entity<Bar>()
                .HasRequired(b => b.Foo)
                .WithOptional();
    
    modelBuilder.Entity<Baz>()
                .HasRequired(b => b.Foo)
                .WithOptional();
    

    【讨论】:

      【解决方案2】:

      另一个答案部分正确。

      如果您希望 code-forst 引导您的数据库模型与表之间的关系,您必须至少在一个类中定义一个导航属性。

      映射当然也可以在没有关系的情况下工作,但您不会受到数据库/sql 级别的限制。除非您使用迁移或其他一些 sql 脚本添加它们。

      尽管在您的示例中,我不太确定您要定义什么样的关系。这应该是一对一的关系吗?

      在这种情况下,Foo 不需要知道引用它的任何其他类,正如您在链接问题中所回答的那样,只有 一个 类需要它。

      【讨论】:

      • 谢谢,这澄清了我的误解。我匆忙将另一个答案误解为Foo 必须具有导航属性。
      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 2016-10-25
      • 2016-03-16
      • 2014-01-20
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多