2

我的代码如下所示:(其中“用户”是编辑后从视图传回的 UserProfile 实例)

UserProfile original = DBContext.UserProfiles.Where(x => x.UserId == user.UserId).FirstOrDefault();
if (original != null)
{
   original = user;
   DAL.DAL.Instance.TGIMobiledb.SaveChanges();
}

此代码触发没有错误,但不更新数据库。经过一番研究,似乎我必须在调用 SaveChanges() 之前添加以下行

DBContext.Entry(original).State = EntityState.Modified;

但是那行代码会导致这个错误:
“ObjectStateManager 中已经存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”

如果我像这样手动分配每个字段,则更改将保存到数据库中:

original.UserId = user.UserId;
original.FirstName = user.FirstName;
original.Surname = user.Surname;
original.UserName = user.UserName;

显然,这不是最优的,尤其是对于较大的实体。

4

2 回答 2

1

尝试:

DBContext.Entry(original).CurrentValues.SetValues(user);
于 2013-07-30T08:08:12.600 回答
0

我猜您检索用户并检查 null 以查看是否需要创建或更新它。

相反,您可以检查该UserId字段。

if (user.UserId == 0)
{
    DBContext.UserProfiles.Add(user);
}
else
{
    DBContext.UserProfiles.Attach(user);
    DBContext.Entry(user).State = EntityState.Modified;
}
于 2013-07-30T08:09:01.523 回答