C# 子实体不';更新/添加

C# 子实体不';更新/添加,c#,entity-framework,C#,Entity Framework,在我的应用程序中,一个实体关系如下图所示 它如下所示 问题有跨问题,问题可以分为很多种 子类别 我必须在应用程序的整个生命周期中添加/更新/删除分离的问题。添加和删除很简单。但对于更新,我在谷歌上搜索了一下,得到了下面3个选项 1要检索旧实体,请逐个复制所有属性,并将更新的实体复制到旧实体,然后再次保存旧实体。我实现了这个方法,它工作得很好,但它的钟是用于变更管理的 2附加实体,如DataSource.Questions.Attach(实体)

在我的应用程序中,一个实体关系如下图所示

它如下所示

问题有跨问题,问题可以分为很多种 子类别

我必须在应用程序的整个生命周期中添加/更新/删除分离的问题。添加和删除很简单。但对于更新,我在谷歌上搜索了一下,得到了下面3个选项

1要检索旧实体,请逐个复制所有属性,并将更新的实体复制到旧实体,然后再次保存旧实体。我实现了这个方法,它工作得很好,但它的钟是用于变更管理的

2附加实体,如
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();
}