我正在尝试根据现有记录将记录插入到我的数据库中,该记录使用Entity Framework作为模板。
现在的流程是:
var newModel = organization.Models.Where(m => m.IsTemplate == true).FirstOrDefault();
newModel.Name = "Something New";
newModel.IsTemplate = false;
organization.Models.Add(newModel);
_organizationRepo.SaveChanges();
请注意,事先从存储库中读取organization.Models
。
我的问题是,不是使用新名称和没有tempalte标志创建一个dublicate记录,而是更改模板记录。
标准:
我认为实体框架会将organization.Models.Add(newModel)
语句解释为插入新记录,但事实并非如此。
答案 0 :(得分:0)
问题的解决方案是(正如Arie对原始问题所做的评论)在找到模板条目时使用AsNoTracking()
as described here。
使用此功能的一个问题是此解决方法不是
“读取值(模板) - >根据需要进行更改 - >插入新记录”
而是只读操作。这意味着我必须手动急切加载对模板的所有引用,以确保它们包含在DataContext的Add()
操作中。
我是通过在保存对象之前将属性加载到变量中来实现的,例如。
var modelFromTemplate = organization.Models.FirstOrDefault(m => m.IsTemplate == true);
var eagerLoadParams = modelFromTemplate.Parameters.ToList();
//Change stuff as needed on the template here
modelFromTemplate.Name = "Something New";
modelFromTemplate.IsTemplate = false;
//Save the new model
_modelRepo.Add(modelFromTemplate);
_modelRepo.SaveChanges();