C# 子实体不';更新/添加
在我的应用程序中,一个实体关系如下图所示 它如下所示 问题有跨问题,问题可以分为很多种 子类别 我必须在应用程序的整个生命周期中添加/更新/删除分离的问题。添加和删除很简单。但对于更新,我在谷歌上搜索了一下,得到了下面3个选项 1要检索旧实体,请逐个复制所有属性,并将更新的实体复制到旧实体,然后再次保存旧实体。我实现了这个方法,它工作得很好,但它的钟是用于变更管理的 2附加实体,如C# 子实体不';更新/添加,c#,entity-framework,C#,Entity Framework,在我的应用程序中,一个实体关系如下图所示 它如下所示 问题有跨问题,问题可以分为很多种 子类别 我必须在应用程序的整个生命周期中添加/更新/删除分离的问题。添加和删除很简单。但对于更新,我在谷歌上搜索了一下,得到了下面3个选项 1要检索旧实体,请逐个复制所有属性,并将更新的实体复制到旧实体,然后再次保存旧实体。我实现了这个方法,它工作得很好,但它的钟是用于变更管理的 2附加实体,如DataSource.Questions.Attach(实体)
DataSource.Questions.Attach(实体)然后通过DataSource.Entry(Entity.state=System.Data.EntityState.Modified修改其状态代码>
3使用SetValues方法,示例代码如下
var oldData = DataSource.Questions.Find(Entity.QuestionID);
if (oldData != null)
{
DataSource.Entry(oldData).CurrentValues.SetValues(Entity);
DataSource.SaveChanges();
}
我测试了第二种方法,它对父实体有效,然后我也改变了子实体的状态,它也很好
问题是在许多情况下,我必须更新对象,例如问题将附加新的子类别或问题中添加更多的问题。在这些场景中,我们可能也有添加子类别操作
下面是3个修改的必要场景
对于任何问题
1它被标记为ModifiedBy=5
为say法语添加了2个跨问题(LanguageID='French')
3已存在的英语(LanguageID='English')的TransQuestions中的选项2被修改
我该怎么办?
提前感谢。如果您要使用断开连接的实体,您可以使用
using (var context = new TestDbContext())
{
//1. Load a Question from Db
var question = context.Questions
.Include("TransQuestions")
.Where(/*some conditions*/)
.AsNoTracking()
.FindFirstOrDefault();
//2. Do some changes with question and its childs
....
//3. Update Db values with changed question values
context.UpdateGraph(question,
map => map.OwnedCollection(p => p.TransQuestion));
context.SaveChanges();
}