5

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

public class Foo {
    // ...
}

public class Bar {
    // ...

    public Foo Foo { get; set; }
}

public class Baz {
    // ...

    public Foo Foo { get; set; }
}

不过,在我看到的每个示例Foo中,都在类中添加了外来对象引用。我的Foo班级可以不知道BarandBaz班级,还是我真的需要做这样的事情?

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

    public virtual Baz { get; set; }
}

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

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

4

2 回答 2

2

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

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

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

modelBuilder.Entity<Baz>()
            .HasRequired(b => b.Foo)
            .WithOptional();
于 2012-08-22T19:51:10.253 回答
1

另一个答案部分正确。

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

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

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

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

于 2012-08-22T18:33:24.870 回答