Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用新密钥复制实体_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 使用新密钥复制实体

C# 使用新密钥复制实体,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,因此,在使用Entity Framework的ASP.NET MVC应用程序中,我希望能够将现有实体(在本例中为PERS936AB_request_original)复制、更改一些数据,并将新实体保存到数据库中。以下是我目前拥有的: var PERS936AB_request_original = db.PERS936AB.Single(r => r.ID == id); var new_request = DataContractSerialization<PERS936AB>

因此,在使用Entity Framework的ASP.NET MVC应用程序中,我希望能够将现有实体(在本例中为
PERS936AB_request_original
)复制、更改一些数据,并将新实体保存到数据库中。以下是我目前拥有的:

var PERS936AB_request_original = db.PERS936AB.Single(r => r.ID == id);
var new_request = DataContractSerialization<PERS936AB>(PERS936AB_request_original);
new_request.Year = currentYear;
db.PERS936AB.AddObject(new_request);
db.SaveChanges();
当我做了所有这些,我得到了以下信息。这条消息很有意义,我只是不知道如何“重置”新实体并给它一个新的密钥,我的搜索结果是徒劳的

ObjectStateManager中已存在具有相同密钥的对象。 ObjectStateManager无法跟踪具有相同属性的多个对象 钥匙


任何帮助都会很棒,谢谢

您需要将ID更改为0。EF认为它们是完全相同的实体(即使年份不同),因为它根据对象本身的ID进行检查。将其设置为0将告诉EF它是一个全新的实体。

问题是原始对象已被跟踪,因此无法添加其副本。但是跟踪原始文件是不必要的,因为您没有更新它。因此,您必须确保该对象未被跟踪。同时,您不需要这个序列化步骤。您可以简单地修改原始对象并将其添加到上下文中。EF将其视为一个全新的实例,并忽略其当前主键值:

db.ContextOptions.LazyLoadingEnabled = false;
db.PERS936AB.MergeOption = MergeOption.NoTracking;
var new_request = db.PERS936AB.Single(r => r.ID == id);
new_request.Year = currentYear;
db.PERS936AB.AddObject(new_request);
db.SaveChanges();

我禁用延迟加载只是为了确保:它可以防止无意中添加嵌套对象。

只需将key属性设置为默认值,例如,如果它是一个名为Id的int属性,则只需执行
new\u request.Id=default(int)
,这将设置为0。@BenRobinson我在下面对IronMan84的回答做了一个评论。你能不能创建一个新模型(使用新PK),从另一个模型读取数据,然后保存新模型?如果我最终执行
new_request.ID=default(int)
new_request.ID=0
,我仍然收到相同的错误消息。对象上有导航属性吗?没有。只有一些属性、从
对象继承的方法和一些事件。您是否尝试过为保存创建一个新的DbContext类?哇!这对我来说非常有效。谢谢你的解释!
db.ContextOptions.LazyLoadingEnabled = false;
db.PERS936AB.MergeOption = MergeOption.NoTracking;
var new_request = db.PERS936AB.Single(r => r.ID == id);
new_request.Year = currentYear;
db.PERS936AB.AddObject(new_request);
db.SaveChanges();