【问题标题】:Child Entities Don't Update/Add子实体不更新/添加
【发布时间】:2014-11-30 10:59:45
【问题描述】:

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

就这么简单

Qustion 有 TransQuestions,问题可以分为很多 子类别

我必须在应用程序的整个生命周期中添加/更新删除 DETACHED 问题。添加和删​​除很简单。但是对于更新,我用谷歌搜索并得到了以下 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 添加到问题中。在这些场景中,我们也可能有 add 子类别操作。

以下是3次修改所需的场景

如有任何问题,

1 标记为 ModifiedBy = 5,

为说 法语 语言(LanguageID = 'French')添加了 2 个 TransQuestions

3 已存在 English (LanguageID = 'English)' 的 TransQuestions 中的 Option2 已修改。

我该怎么办?

提前致谢。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    如果您应该使用断开连接的实体,您可以使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2013-03-03
      • 2018-06-29
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多