gpt4 book ai didi

entity-framework - Entity Framework POCO-刷新导航属性

转载 作者:行者123 更新时间:2023-12-04 07:24:33 24 4
gpt4 key购买 nike

我在刷新相关的实体集合时遇到了一些麻烦。

本质上,问题如下:

public class Student
{
public virtual ICollection<Lecture> Lectures { get; set; }

public void AddLecture(Lecture lecture)
{
Lectures.Add(lecture);
}

public void CancelChanges()
{
_context.Refresh(RefreshMode.StoreWins, this);
_context.LoadProperty(this, (o) => o.Lectures,
MergeOption.OverwriteChanges);
}
}

public class Grade
{
public virtual Student { get; set; }
}

现在,我有了一些用于添加讲座的GUI,如果需要,我们可以取消编辑过程:
public void ExampleEdit()
{
Student student = _context.Students.SingleOrDefault(/* blah */);
student.AddLecture(_context.Lectures.SingleOrDefault(/* e.g. math */));
student.CancelChanges();
// At this point student SHOULD have no lectures anymore since the
// property was loaded with overwrite changes option.
// Yet the Lectures still contains the lecture we added there
}

那么,代码不好吗?有没有我使用不正确的方法?是否可以完全重新加载整个对象?

最佳答案

我认为您误解了MergeOption.OverwriteChanges。默认情况下,无论何时任何ObjectContext执行查询,如果缓存中已经存在任何返回的对象,则这些对象的新返回副本将被忽略。

请注意,这一切都是基于 EntityKeys 来进行的。基本上,将检查从查询返回的对象的EntityKey,并且如果缓存中已经存在具有相同 EntityKey(在同一EntitySet中,则为Lectures)的对象,则不更改现有对象。

但是,如果启用OverwriteChanges,则即使已编辑内存中实体,它也会用数据库中的值替换现有实体的当前值。

如您所见,您正在向学生添加一个对Student来说是全新的演讲,并且不会被覆盖,因为根据您的LoadProperty()调用,它的EntityKey与来自数据库的EntityKey不同。

一种解决方案是仅在LoadProperty()之前从学生对象中清除所有讲座:

public void CancelChanges() {
_context.Refresh(RefreshMode.StoreWins, this);
this.Lectures.Clear();
_context.LoadProperty(this, (o) => o.Lectures, MergeOption.OverwriteChanges);
}

关于entity-framework - Entity Framework POCO-刷新导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3839166/

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