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 loadBaz
进行数据库调用
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 loadBaz
进行数据库调用
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关键字与您的关系没有任何关系,正如前面提到的,它与懒惰、渴望加载有关