Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么代码优先类需要导航属性?_C#_.net_Entity Framework_Ef Code First - Fatal编程技术网

C# 为什么代码优先类需要导航属性?

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; } } 根据,类确实需要具有导航属性。我刚开始编写代码,有人能解释一下为什么会出现这种情况吗?有没有一

我有一些看起来像这样的域类,我想先用代码建模(在EF4.3中)

在我看到的每一个例子中,在
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();