为了账号安全,请及时绑定邮箱和手机立即绑定

实体框架5实体的深层复制/克隆

实体框架5实体的深层复制/克隆

哔哔one 2019-12-25 10:33:53
我正在使用Entity Framework 5(DBContext),并且试图找到最好的方法来深度复制实体(即复制实体和所有相关对象),然后将新实体保存在数据库中。我怎样才能做到这一点?我已经研究过使用扩展方法,例如,CloneHelper但不确定是否适用于DBContext。
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

克隆实体的一种廉价的简便方法是执行以下操作:


var originalEntity = Context.MySet.AsNoTracking()

                             .FirstOrDefault(e => e.Id == 1);

Context.MySet.Add(originalEntity);

Context.SaveChanges();

这里的诀窍是AsNoTracking() -当您加载这样的实体时,您的上下文不知道它,并且当您调用SaveChanges时,它将像对待新实体一样对待它。


如果MySet有引用MyProperty并且您也想要它的副本,则只需使用Include:


var originalEntity = Context.MySet.Include("MyProperty")

                            .AsNoTracking()

                            .FirstOrDefault(e => e.Id == 1);


查看完整回答
反对 回复 2019-12-25
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

这是另一个选择。


在某些情况下,我更喜欢它,因为它不需要您专门运行查询来获取要克隆的数据。您可以使用此方法创建已经从数据库获得的实体的克隆。


//Get entity to be cloned

var source = Context.ExampleRows.FirstOrDefault();


//Create and add clone object to context before setting its values

var clone = new ExampleRow();

Context.ExampleRows.Add(clone);


//Copy values from source to clone

var sourceValues = Context.Entry(source).CurrentValues;

Context.Entry(clone).CurrentValues.SetValues(sourceValues);


//Change values of the copied entity

clone.ExampleProperty = "New Value";


//Insert clone with changes into database

Context.SaveChanges();

此方法将当前值从源复制到已添加的新行。


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 392 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信