实体框架6添加/更新 - 编辑时出错,并尝试将编辑的实体添加为新实体

时间:2014-03-08 10:54:16

标签: 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”是对象关键信息的一部分,无法修改。

2 个答案:

答案 0 :(得分:2)

只有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();  

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

答案 1 :(得分:1)

实体框架在编辑对象时跟踪对象。如果要将新行插入数据库,请在内存中使用所需的值创建新对象并添加该对象。像AutoMapper这样的库可能会派上用场。