为什么Code First类需要导航属性?

时间:2012-08-22 18:05:11

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

我有一些看起来像这样的域类,我想用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课程可以与BarBaz课程无关,还是我真的需要这样做?

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

    public virtual Baz { get; set; }
}

根据this answer do 类需要具有导航属性。我是Code First的新手,所以有人可以解释为什么会出现这种情况吗?有没有办法可以通过使用Fluent API来避免像这样污染我的Foo类?

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

2 个答案:

答案 0 :(得分:2)

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

一旦接受此限制,您只需使用您的模型并将其映射为:

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

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

答案 1 :(得分:1)

另一个答案部分正确。

如果您希望使用代码来支持数据库模型与表之间的关系,那么您必须至少在一个类中定义一个导航属性。

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

虽然在你的例子中我不太确定你无论如何都要确定什么样的关系。那应该是一对一的关系吗?

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