我有一些看起来像这样的域类,我想用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, do 类需要具有导航属性。我是Code First的新手,所以有人可以解释为什么会出现这种情况吗?有没有办法可以通过使用Fluent API来避免像这样污染我的Foo
类?
Foo
需要了解每个使用它的类,这对我来说似乎很奇怪。我的设计在某种程度上是否存在根本上的缺陷?
答案 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不需要知道任何其他引用它的类,正如链接问题中所回答的那样,只有一个类需要它。