我是一个胡言乱语的残骸,试图首先获取 EF 代码,让我在 SQL 中做一些我可以在 2 分钟内完成的事情。如果我还没有花 5 天时间试图让它工作,我只需在 DDL 中编写我的数据库并使用 ADO.NET。但我离题了...
我想要 2 个表,其中 A 中的每条记录在 B 中都有对应的记录。它们都是同一个对象的一部分;由于我不会进入的原因,它们需要在单独的表格中(但它们确实如此,所以不要去那里)。如果我从数据库端设计它,我只需从 B 到 A 建立一个 FK 关系。工作完成。
在 EF Code First 中,我尝试使用共享主键方法和一对一外键关联方法,但都不适合我。我还尝试了我能想到的所有变体的 100 种左右的组合,而且我没有进一步前进。
正如我所说,我想要的是从 A 到 B 的可导航关系(返回会很好,但我已经读过这是不可能的),并且这种关系是延迟加载的,所以我可以说a.b
并可以访问 b 的字段。
我不可能列举出我尝试过的所有东西,所以让我举一个几乎可行的例子:
class Foo
{
public int Id { get; set; }
public string FooProperty { get; set; }
public virtual Bar Bar { get; set; }
}
class Bar
{
public int Id { get; set; }
public string BarProperty { get; set; }
}
请注意,没有从 Bar 到 Foo 的反向引用,因为 (a) SQL Server 会抱怨多个级联删除路径,并且 (b) EF 会抱怨不知道哪一侧是关联的主体端。所以...很好 - 我可以没有它。
这让我进入数据库的是一个Foos
带有和字段的表Id
,以及一个带有和字段的表。这与我在 SQL 中建模的方式非常接近,尽管我可能会将 FK 字段放入而不是. 但由于它是 1:1,我猜这并不重要。FooProperty
Bar_Id
Bars
Id
BarProperty
Bar
Foo
我说这几乎可行的原因是,如果我添加 aBar
和关联Foo
然后将它们重新加载,Bar
则对象的属性Foo
为空。
using (var dbContext = new MyDbContext())
{
var foo = dbContext.Foos.Create();
foo.FooProperty = "Hello";
dbContext.Foos.Add(foo);
var bar = dbContext.Bars.Create();
bar.BarProperty = "world";
foo.Bar = bar;
dbContext.SaveChanges();
}
using (var dbContext = new MyDbContext())
{
foreach (var foo in dbContext.Foos)
Console.WriteLine(foo.Bar.Id); // BOOM! foo.Bar is null
}
我通常希望评估foo.Bar
触发对象的延迟加载Bar
,但事实并非如此-该属性仍然存在null
。
我该如何解决?