c# - Entity Framework 6 添加/更新 - 编辑时出错并尝试将编辑的实体添加为新实体

标签 c# .net entity-framework

我有一个如下所示的模型

public class XYZModel 
{
public string Id; // GUID, primary key;
public string Name;
public string AssociationId; // GUID, AllowNull;
}

我在做什么..
这工作正常

XYZModel abc = new XYZModel();
abc.Id = Convert.ToString(Guid.NewGuid());
abc.Name = "ABC Name";
xyzDbContext.XYZModels.Add(abc);
xyzDbContext.SaveChanges();

我的目标是什么?通过id获取实体,对其进行编辑,更改其主键Id值,并将其添加为新条目。但添加时出现错误。

XYZModel xyz = xyzDbContext.XYZModels.Find("xyzguid");

//modifying it
xyz.AssociationId = xyz.Id;
xyz.Id = Convert.ToString(Guid.NewGuid());
xyz.Name = "New Name";

//trying to add it as new entry
xyzDbContext.XYZModels.Add(xyz);// Error 
xyzDbContext.SaveChanges();

它抛出一个错误
属性“Id”是对象关键信息的一部分,无法修改。

最佳答案

仅当 xyz 对象与 Context 分离时,您才能执行此操作。

有两种方法:

XYZModel xyz = xyzDbContext.XYZModels.Find("xyzguid");
xyzDbContext.Entry(xyz).State = EntityState.Detached;

或使用AsNoTracking.FirstOrDefault

XYZModel xyz = xyzDbContext.XYZModels.AsNoTracking().FirstOrDefault(s => s.Id =="xyzguid");

第一种方法的代码:

XYZModel xyz = xyzDbContext.XYZModels.Find("xyzguid");

xyzDbContext.Entry(xyz).State = EntityState.Detached;

//modifying it
xyz.AssociationId = xyz.Id;
xyz.Id = Convert.ToString(Guid.NewGuid());
xyz.Name = "New Name";

//trying to add it as new entry
xyzDbContext.XYZModels.Add(xyz);// No Error 
xyzDbContext.SaveChanges();  

注意: 您必须在 Id 属性上使用 DatabaseGenerateOption.None 注释。

关于c# - Entity Framework 6 添加/更新 - 编辑时出错并尝试将编辑的实体添加为新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22268343/

相关文章:

c# - 锁定文件 block

c# - 当前上下文中不存在名称 'Key'

c# - 使用生成的 Golang DLL 返回字符串或 *C.Char

.net - 哪些文件名占位符可用于 Serilog?

c# - "where"条款 : entity id is in a potentially null array

c# - TransactionScope 是否适用于不同的 Context 对象

c# - Nuget MVC PagedList 页面链接无法正常工作

c# - 如何在表单中找到图片框并为它们添加特定的事件处理程序

.net - VB.net 整数计数错误

c# - SelectLists 属于 viewModels 吗?