如何在EF中复制多表数据
这两天做一个功能是将数据库中的一条数据(多表)进行原样复制,我的实现方法是将表中对应的每一个字段都重写一下添加到新的对象中,只是不添加Id,然后再添加到数据库
中,这样就将元数据完整的复制了一变,但是这样做的缺点有两个,一是如果某个表字段很多,而且我们要做的是全表复制,那么我们的工作量会很大,二是如果我们的对象字段做了
某些修改的话,这里也要跟着做相应的变化。
所以我想到了将这个对象赋给我的新对象,只是将他的Id改为0,然后添加进去。那这里到底怎么做呢?这里就用到了Detach这个方法,Detach的意思是分离、拆开,下面来看
看具体是怎么做的吧!
1>我们要将数据从数据库里取出来,这里叫Merchant oldMerchant=xxxxxx。
2>将我们要修改的数据赋给一个新的对象实例。
//主表 Merchant newMerchant = oldMerchant; //一对一 MerchantOtherSetting merchantOtherSetting = oldMerchant.MerchantOtherSetting; //一对多 List<MerchantRep> reps = new List<MerchantRep>(); foreach (var rep in oldMerchant.MerchantReps) { reps.Add(rep); }
3>将获取到的新对象实例Detach。
_context.Detach(newMerchant); _context.Detach(merchantOtherSetting); //对于集合对象要 循环 分离 foreach (var rep in reps) { _context.Detach(rep); }
4>将他们的ID都改为0,然后赋值给主表。
//Merchant newMerchant.MerchantID = 0; //MerchantOtherSetting merchantOtherSetting.MerchantID = 0; newMerchant.MerchantOtherSetting = merchantOtherSetting; //MerchantRep(集合对象要循环修改、循环赋值) foreach (var rep in reps) { rep.MerchantID = 0; rep.MerchantRepID = 0; } foreach (var rep in reps) { newMerchant.MerchantReps.Add(rep); }
5>将新对象添加到数据库,保存
_context.Merchants.AddObject(newMerchant);
_context.SaveChanges();
这样,数据表的完整复制就完成了。