实体框架5深度复制/克隆实体

kyp*_*ypk 69 dbcontext entity-framework-5

我正在使用Entity Framework 5(DBContext),我正在尝试找到深度复制实体的最佳方法(即复制实体和所有相关对象),然后将新实体保存在数据库中.我怎样才能做到这一点?我已经研究过使用扩展方法,CloneHelper但我不确定它是否适用DBContext.

Leo*_*Leo 123

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

var originalEntity = Context.MySet.AsNoTracking()
                             .FirstOrDefault(e => e.Id == 1);
Context.MySet.Add(originalEntity);
Context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这里的技巧是AsNoTracking() - 当您加载这样的实体时,您的上下文不知道它,当您调用SaveChanges时,它会将其视为一个新实体.

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

var originalEntity = Context.MySet.Include("MyProperty")
                            .AsNoTracking()
                            .FirstOrDefault(e => e.Id == 1);
Run Code Online (Sandbox Code Playgroud)

  • 这对我使用EF Core非常有用.但是,我必须将父键和嵌套对象上的主键设置为Guid.Empty,以防止EF尝试在数据库中插入重复的行.如果你使用整数键我怀疑将它们设置为0会产生相同的效果. (3认同)

Jas*_*ere 21

这是另一种选择.

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

//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();
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您希望在一个SaveChanges中将克隆与原始更新一起插入,则此方法很有用 (2认同)
  • 这不是“深层”克隆。问题标题和文本询问有关“复制实体和所有相关对象”的深层克隆。 (2认同)