在我的MVVM程序中,我有一个Model类(比如MyModel
),我有一个从数据库读取数据的实例(使用实体框架)。在检索对象时,我将所有数据呈现给用户。稍后,用户将修改一些字段。
我想要的是创建相同的对象,除了它的ID
(因为该ID
是主键并自动递增)。
那么,我该如何处理这个问题呢?我不想一个接一个地复制所有字段,这不是一个健壮的方法。因为也许在未来模型可能会被修改,所以我必须在克隆方法中考虑到这一点。
那么,有没有什么很好的方法来复制对象,并且当保存到数据库中时,它的ID会再次自动递增呢?(将ID设置为null
会给我一个编译器错误,因为它的类型是int
)。
我注意到不需要复制。显然,在向数据库添加模型的实例时(即使ID设置为数据库中已存在的实例),实体框架会在数据库中插入新行并自动递增其主键。所以这个功能已经内置到EF中了。我不知道,抱歉。
为了清楚起见,这里有一个例子:
我发现这是为了看看是否有比我目前使用的更好的方法来克隆对象,并注意到,如果你试图做多个clones...at,至少如果你想避免多次创建上下文,那么公认的答案可能会有问题。
我不知道这是不是最好的克隆方法,这就是为什么我在寻找另一种方法。但是,它是有效的。如果需要多次克隆一个实体,可以像这样使用JSON序列化到clone...something (使用Newtonsoft JSON)。
Lori Peterson建议在EF6中使用.AsNoTracking()执行克隆。我正在使用这个方法,并且可以确认它是有效的。您甚至可以包含子对象。
从数据集中检索一个或多个实体时,可以告诉entity Framework不要跟踪对该对象所做的任何更改,然后将该实体作为新实体添加到dataset中。使用.AsNoTracking时,上下文不知道有关现有实体的任何信息。