在不更改模板的情况下从模板记录在数据库中插入记录 - 实体框架

时间:2017-03-30 07:52:05

标签: c# entity-framework

我正在尝试根据现有记录将记录插入到我的数据库中,该记录使用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)语句解释为插入新记录,但事实并非如此。

1 个答案:

答案 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();