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/google-app-engine/4.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#_Entity Framework - Fatal编程技术网

C# 我是否定义依赖关系或主体上两个实体之间的关系?

C# 我是否定义依赖关系或主体上两个实体之间的关系?,c#,entity-framework,C#,Entity Framework,当使用实体框架时,我会弄不清楚我需要在哪里定义两个实体之间的关系。我觉得每当我寻找例子时,我最终都会从两个不同的角度找到相同事物的例子——依赖→ 校长,还有校长→ 依赖的 鉴于以下实体: class Foo { public int Id { get; set; } public virtual ICollection<Bar> Bars { get; set; } } class Bar { public int Id { get; set; }

当使用实体框架时,我会弄不清楚我需要在哪里定义两个实体之间的关系。我觉得每当我寻找例子时,我最终都会从两个不同的角度找到相同事物的例子——依赖→ 校长,还有校长→ 依赖的

鉴于以下实体:

class Foo
{
    public int Id { get; set; }
    public virtual ICollection<Bar> Bars { get; set; }
}

class Bar
{
    public int Id { get; set; }
    public Foo Foo { get; set; }
    public virtual Baz { get; set; }
}

class Baz
{
    public int Id { get; set; }
    public Bar Bar { get; set; }
}

我想你被
virtual
关键字弄糊涂了。我试着在你链接的页面上找到它,但它不在那里

virtual
关键字允许实体框架覆盖它在幕后创建的代理实体中的属性,该代理实体从
栏继承。然后,当访问属性时,覆盖将对lazy load
Baz
进行数据库调用

virtual
关键字与关系的定义无关,如果您不想延迟加载,就不需要它

映射时定义主体:

modelBuilder.Entity<bar>()
            .HasOptional(f => f.Baz). //Baz is dependent
            .WithRequired(s => s.Bar);//Bar is principal

modelBuilder.Entity<bar>()
            .HasOptional(f => f.Bar). //Bar is dependent
            .WithRequired(s => s.Baz);//Baz is principal
modelBuilder.Entity()
.has可选(f=>f.Baz)//Baz是独立的
.需要(s=>s.Bar)//酒吧是主要的
modelBuilder.Entity()
.has可选(f=>f.Bar)//酒吧是独立的
.需要(s=>s.Baz)//巴兹是校长
至于示例中
Foo
Bar
之间的另一种关系,
Foo
有一组
Bar
,但
Foo
只有一个
Bar
,因此外键继续。默认情况下,EF将这样做

依赖项获取引用主体密钥的外键。当它是一对一时,外键也是依赖项的主键,但EF无法确定哪个是哪个,这就是为什么在指定它之前会出现错误


参考资料:

我想你被
virtual
关键字弄糊涂了。我试着在你链接的页面上找到它,但它不在那里

virtual
关键字允许实体框架覆盖它在幕后创建的代理实体中的属性,该代理实体从
栏继承。然后,当访问属性时,覆盖将对lazy load
Baz
进行数据库调用

virtual
关键字与关系的定义无关,如果您不想延迟加载,就不需要它

映射时定义主体:

modelBuilder.Entity<bar>()
            .HasOptional(f => f.Baz). //Baz is dependent
            .WithRequired(s => s.Bar);//Bar is principal

modelBuilder.Entity<bar>()
            .HasOptional(f => f.Bar). //Bar is dependent
            .WithRequired(s => s.Baz);//Baz is principal
modelBuilder.Entity()
.has可选(f=>f.Baz)//Baz是独立的
.需要(s=>s.Bar)//酒吧是主要的
modelBuilder.Entity()
.has可选(f=>f.Bar)//酒吧是独立的
.需要(s=>s.Baz)//巴兹是校长
至于示例中
Foo
Bar
之间的另一种关系,
Foo
有一组
Bar
,但
Foo
只有一个
Bar
,因此外键继续。默认情况下,EF将这样做

依赖项获取引用主体密钥的外键。当它是一对一时,外键也是依赖项的主键,但EF无法确定哪个是哪个,这就是为什么在指定它之前会出现错误


参考:

当您使用您在类中定义的EF时,您已经定义了您的关系。 EF能够理解在类的集合中定义导航属性时

公共虚拟ICollection条{get;set;}

你想要一对多的关系

另一方面,如果将集合添加到其他类中

公共虚拟ICollection Foos{get;set;}

英孚会理解你想要很多可能的关系

如果您在另一个类中添加一个类实例作为属性,它将理解为一对一(或零对一)关系,同样的事情也会发生


virtual关键字与您的关系无关,如前所述,它与懒惰、渴望加载有关

当您使用您在类中定义的EF时,您已经定义了您的关系。 EF能够理解在类的集合中定义导航属性时

公共虚拟ICollection条{get;set;}

你想要一对多的关系

另一方面,如果将集合添加到其他类中

公共虚拟ICollection Foos{get;set;}

英孚会理解你想要很多可能的关系

如果您在另一个类中添加一个类实例作为属性,它将理解为一对一(或零对一)关系,同样的事情也会发生

virtual关键字与您的关系没有任何关系,正如前面提到的,它与懒惰、渴望加载有关