学习
实践
活动
专区
工具
TVP
写文章

实体框架6:除ID外的克隆对象

浏览 24关注 0回答 5得票数 63
原文

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

我想要的是创建相同的对象,除了它的ID (因为该ID是主键并自动递增)。

那么,我该如何处理这个问题呢?我不想一个接一个地复制所有字段,这不是一个健壮的方法。因为也许在未来模型可能会被修改,所以我必须在克隆方法中考虑到这一点。

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

原文
jaycer修改于2017-07-22 08:51

5 个回答

高票数最新
QuantumHive
修改于2018-07-29 19:55
已采纳
得票数 72

我注意到不需要复制。显然,在向数据库添加模型的实例时(即使ID设置为数据库中已存在的实例),实体框架会在数据库中插入新行并自动递增其主键。所以这个功能已经内置到EF中了。我不知道,抱歉。

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

sweetfa
回答于2015-04-09 14:36
得票数 7

使用ObjectContext时,QuantumHive提供的答案不起作用。

在这种情况下返回的错误是:

要正确克隆实体框架对象(至少在EF6.0中)是:

Kevin Nelson
修改于2016-10-01 04:00
得票数 6

我发现这是为了看看是否有比我目前使用的更好的方法来克隆对象,并注意到,如果你试图做多个clones...at,至少如果你想避免多次创建上下文,那么公认的答案可能会有问题。

我不知道这是不是最好的克隆方法,这就是为什么我在寻找另一种方法。但是,它是有效的。如果需要多次克隆一个实体,可以像这样使用JSON序列化到clone...something (使用Newtonsoft JSON)。

jaycer
回答于2017-07-22 04:24
得票数 61

Lori Peterson建议在EF6中使用.AsNoTracking()执行克隆。我正在使用这个方法,并且可以确认它是有效的。您甚至可以包含子对象。

从数据集中检索一个或多个实体时,可以告诉entity Framework不要跟踪对该对象所做的任何更改,然后将该实体作为新实体添加到dataset中。使用.AsNoTracking时,上下文不知道有关现有实体的任何信息。

user1855805
回答于2019-05-24 19:53
得票数 0

我使用postgres数据库:

上面提到的方法没有一个在我的例子中不起作用。我的第二个用法是:

页面原文内容由QuantumHive、jaycer、thestephenstanton、Kirsten、kiml42、marchWest、David Moores、WtFudgE、riqitang、CervEd、sweetfa、Kevin Nelson、rubens.lopes、Angel Venchev、Jim B、Dalton、Rickard Liljeberg、user1855805提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:https://stackoverflow.com/questions/25720803复制

所属标签

c#entity-frameworkmvvmentity-framework-6

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券