gpt4 book ai didi

c# - 我是在依赖实体还是委托(delegate)人上定义两个实体之间的关系?

转载 作者:行者123 更新时间:2023-11-30 20:53:55 25 4
gpt4 key购买 nike

使用 Entity Framework 时,我对需要在哪里定义两个实体之间的关系感到困惑。我觉得每当我寻找示例时,我最终都会从两个不同的角度找到同一事物的示例 - 依赖 → 主体,以及主体 → 依赖。

给定以下实体:

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; }
}

我们这里有几个场景。 Foo 有很多 Bar 指向它。 Baz 有一个可选的外键到 BarBaz 可以在没有指定 Bar 的情况下存在。

我应该在哪里定义这些关系?在哪里,我的意思是当使用流畅的 API 时,这些关系将根据哪个实体定义?也许为了更清楚,如果我使用流畅的 API 和 EntityTypeConfiguration 类进行绑定(bind),这些将在哪个实体中定义?

我感到困惑的一个例子是因为我看到类似 this one 的答案也就是说,应该在类中使用 virtual 定义一对一。所以在这些实体中,BazBar 之间的可选一对一将是,或者类似于:

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

最佳答案

我认为您对 virtual 关键字感到困惑。我确实试图在您链接到的页面上找到它,但它不在那里。

virtual 关键字让 Entity Framework 在它在幕后创建并继承自 Bar 的代理实体中覆盖该属性。然后,覆盖将在访问属性时对延迟加载 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

至于您示例中 FooBar 之间的其他关系,Foo 具有 Bars 的集合但是 Foo 只有一个 Bar 所以外键在 Bar 上。 EF 将默认执行此操作。

从属获取引用委托(delegate)人 key 的外键。当它是一对一时,该外键也是依赖项的主键,但 EF 无法确定哪个是哪个,这就是为什么在指定它之前会出现错误的原因。

引用:http://msdn.microsoft.com/en-us/library/ee382827.aspx

关于c# - 我是在依赖实体还是委托(delegate)人上定义两个实体之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19580054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com