我有一些POCO对象看起来像这样:
public class Foo
{
public int Id { get; set; }
public string FooProperty { get; set; }
public int BarId { get; set; }
public virtual Bar Bar { get; set; }
}
public class Bar
{
public int Id { get; set; }
public string BarProperty { get; set; }
public int FooId { get; set; }
public virtual Foo Foo { get; set; }
}
每个Foo对象只有一个柱(反之亦然)。
现在我想创建一对新的 Foo/Bar 对象。所以我这样做(这就是我怀疑我出错的地方):
var foo = new Foo() { FooProperty = "hello" };
dbContext.Foos.Add(foo);
var bar = new Bar() { BarProperty = "world" };
foo.Bar = bar;
dbContext.SaveChanges();
正如您可能知道的那样,我希望因为我"添加"了foo
,那么bar
也会被添加,因为它是同一对象图的一部分,但不:它没有添加 - 在调用SaveChanges
后,Bar
对象的FooId
也没有更新(尽管 Foo 对象的Id
已更新)。
因此,我的猜测是,这种行为是因为我正在处理 POCO 而不是 EF 代理对象,因此没有"管道"来使其工作。我可以从Foo
对象中获取Id
并手动将其存储在Bar
对象中(反之亦然),并对SaveChanges
进行更多调用,但显然这不是正确的方法。
因此,大概我需要创建 EF 代理对象而不是裸露的 POCO 对象。最好的方法是什么?
如果实体满足创建代理对象的要求,则可以通过从上下文本身调用 create 函数来实现此工作:
var foo = dbContext.Foos.Create();
dbContext.Foos.Add(foo);
var bar = dbContext.Bars.Create();
foo.Bar = bar;
dbContext.SaveChanges();