C# 为什么代码优先类需要导航属性?
我有一些看起来像这样的域类,我想先用代码建模(在EF4.3中) 在我看到的每一个例子中,在C# 为什么代码优先类需要导航属性?,c#,.net,entity-framework,ef-code-first,C#,.net,Entity Framework,Ef Code First,我有一些看起来像这样的域类,我想先用代码建模(在EF4.3中) 在我看到的每一个例子中,在Foo类中都添加了外来对象引用。我的Foo类是否可以对Bar和Baz类不可知,或者我真的需要这样做 public class Foo { // ... public virtual Bar { get; set; } public virtual Baz { get; set; } } 根据,类确实需要具有导航属性。我刚开始编写代码,有人能解释一下为什么会出现这种情况吗?有没有一
Foo
类中都添加了外来对象引用。我的Foo
类是否可以对Bar
和Baz
类不可知,或者我真的需要这样做
public class Foo {
// ...
public virtual Bar { get; set; }
public virtual Baz { get; set; }
}
根据,类确实需要具有导航属性。我刚开始编写代码,有人能解释一下为什么会出现这种情况吗?有没有一种方法可以通过使用Fluent API避免像这样污染我的Foo
类
我觉得很奇怪,
Foo
需要了解使用它的每个类。我的设计只是在某些方面存在根本性的缺陷吗?另一个答案部分是正确的
如果希望code forst使用表之间的关系引导数据库模型,则必须至少在一个class a导航属性中定义
当然,映射在没有关系的情况下也可以工作,但是在数据库/sql级别上没有约束。除非您使用迁移或其他sql脚本添加它们
尽管在你的例子中,我不太确定你到底想要定义什么样的关系。这应该是一对一的关系吗
在这种情况下,Foo不需要知道任何其他类是否有引用,正如您在链接问题中所回答的,只有一个类需要有引用。您这里的问题是一对一关系的要求。EF中的一对一关系通过主键映射。您选择主体实体,并且从属实体的主键上必须有FK-它们必须具有相同的主键值才能关联。原因是缺少对唯一密钥的支持 接受此限制后,您可以简单地使用模型并将其映射为:
modelBuilder.Entity<Bar>()
.HasRequired(b => b.Foo)
.WithOptional();
modelBuilder.Entity<Baz>()
.HasRequired(b => b.Foo)
.WithOptional();
modelBuilder.Entity()
.HasRequired(b=>b.Foo)
.WithOptional();
modelBuilder.Entity()
.HasRequired(b=>b.Foo)
.WithOptional();
谢谢,这澄清了我的误解。我匆忙地误解了另一个答案,认为Foo
必须具有导航属性。
modelBuilder.Entity<Bar>()
.HasRequired(b => b.Foo)
.WithOptional();
modelBuilder.Entity<Baz>()
.HasRequired(b => b.Foo)
.WithOptional();