gpt4 book ai didi

c# - 为什么在 EF6 中调用 dbContext.Save 后会重置导航属性

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:21 29 4
gpt4 key购买 nike

背景:我正在使用 EF6 和数据库优先。

我遇到了一个让我困惑的场景。创建新对象、使用新对象填充导航属性并调用 SaveChanges 后,导航属性将被重置。在 SaveChanges 调用之后引用导航属性的第一行代码将最终从数据库中重新获取数据。这是预期的行为吗,有人可以解释为什么会这样吗?这是我的场景的示例代码块:

using (DbContext context = new DbContext) {
Foo foo = context.Foos.Create();
context.Foos.Add(foo);
...
Bar bar = context.Bars.Create();
context.Bars.Add(bar);
...
FooBar foobar = context.FooBars.Create();
context.FooBars.Add(foobar)
foobar.Foo = foo;
foobar.Bar = bar;

//foo.FooBars is already populated, so 1 is returned and no database query is executed.
int count = foo.FooBars.Count;

context.SaveChanges();

//This causes a new query against the database - Why?
count = foo.FooBars.Count;
}

最佳答案

我不能说 100%,但我怀疑这种行为是专门做出来的。

至于为什么会这样,问题的根源在于DbCollectionEntry.IsLoaded属性为 false,直到导航属性隐式延迟加载或使用 Load 方法显式加载。

当实体处于已添加状态时,延迟加载似乎也被抑制了,这就是第一次调用不会触发重新加载的原因。但是一旦调用 SaveChanges,实体状态变为未修改,虽然集合没有真正设置为“null”或被清除,下一次尝试访问集合属性将触发延迟重载。

// ...

Console.WriteLine(context.Entry(foo).Collection(e => e.FooBars).IsLoaded); // false
//foo.FooBars is already populated, so 1 is returned and no database query is executed.
int count = foo.FooBars.Count;

// Cache the collection property into a variable
var foo_FooBars = foo.FooBars;

context.SaveChanges();

Console.WriteLine(context.Entry(foo).State); // Unchanged!
Console.WriteLine(context.Entry(foo).Collection(e => e.FooBars).IsLoaded); // false

// The collection is still there, this does not trigger database query
count = foo_FooBars.Count;
// This causes a new query against the database
count = foo.FooBars.Count;

如果您想避免重新加载,解决方法是将 IsLoaded 属性显式设置为 true

// ...

context.SaveChanges();

context.Entry(foo).Collection(e => e.FooBars).IsLoaded = true;
context.Entry(bar).Collection(e => e.FooBars).IsLoaded = true;
// No new query against the database :)
count = foo.FooBars.Count;

关于c# - 为什么在 EF6 中调用 dbContext.Save 后会重置导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39597983/

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