儿童实体不要更新/添加

时间:2014-10-06 07:50:34

标签: c# entity-framework

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

enter image description here

就像下面这么简单。

  

Qustion有TransQuestions,问题可能有很多   子类别

我必须在应用程序的整个生命周期中添加/更新删除 DETACHED 问题。添加和删​​除很简单。但是为了更新我用Google搜索并获得了3个以下选项。

1检索旧实体,逐个复制所有属性,从更新的实体复制到旧实体,然后再次保存旧实体。我实施了这种方法,它的工作正常,但它是变革管理的钟。

2附加DataSource.Questions.Attach(Entity);之类的实体,然后按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();
        }

我测试了第二种方法,它适用于父实体,然后我也改变了子实体的状态,它也运行良好。

问题我必须在许多情况下更新对象,例如问题将附加新的子类别或更多TransQuestions被添加到问题中。在这些情况下,我们也可能添加子类别操作。

以下是3次修改所需的方案

如有任何问题,

1它被标记为ModifiedBy = 5,

添加了2个TransQuestions,例如法语语言(LanguageID ='法语')

3 Transcuestions中的Option2已经存在英语(LanguageID ='英语)'被修改了。

我该怎么办?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您应使用断开连接的实体,则可以使用GraphDiff

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();
}

More informations