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);
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();
此方法将当前值从源复制到已添加的新行。
添加回答
举报