我有一个类似下面的模型
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”是对象关键信息的一部分,无法修改。
答案 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这样的库可能会派上用场。