在我的应用程序中,一个实体关系如下图所示。
就像下面这么简单。
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 ='英语)'被修改了。
我该怎么办?
提前致谢。
答案 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();
}