Entity Framework 6:克隆除ID外的对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (257)

在我的MVVM程序中,我有一个Model类(例如MyModel),其中有一个从数据库读取的实例(使用实体框架)。当检索对象时,我向用户展示所有数据。稍后,用户将修改一些字段。

我想要的是创建相同的对象,除了ID(既然那样ID主键自动增量)。

那我怎么才能接近这个呢?我不想一个一个地复制所有字段,这不是一个健壮的方法。因为也许在将来,模型可能会被修改,所以这样的话,我将不得不在克隆方法中考虑到这一点。

那么,有什么优雅的方法来复制对象,并且当保存在数据库中时,它的ID会再次自动递增吗?(将ID设置为null给出一个编译器错误,因为它的类型是int)。

提问于
用户回答回答于

建议使用.AsNoTracking()在EF6中执行克隆。我正在使用这个方法,可以确认它是否有效。

var entity = context.Entities
                    .AsNoTracking()
                    .Include(x => x.ChildEntities)
                    .FirstOrDefault(x => x.EntityId == entityId);

entity.SomeProperty = DateTime.Now;

context.Entities.Add(entity);
context.SaveChanges();

当您从DataSet检索一个或多个实体时,您可以告诉EntityFramework不要跟踪您对该对象所做的任何更改,然后将该实体作为一个新实体添加到DataSet中。通过使用。作为NoTracking,上下文对现有实体一无所知。

用户回答回答于

为了清楚起见,这里有一个例子:

using(var database = new MyDbContext()) {
    MyModel myModel = database.Where(m => m.SomeProperty == someValue);
    myModel.SomeOtherProperty = someOtherValue; //user changed a value
    database.MyModels.Add(myModel); //even though the ID of myModel exists in the database, it gets added as a new row and the ID gets auto-incremented 
    database.SaveChanges();
}

扫码关注云+社区

领取腾讯云代金券