有很多关于这方面的信息,但即使在阅读了几个小时之后,我似乎也无法让它按照我想要的方式工作。
我试图通过传入一个用户对象来更新一个用户对象,并一般比较我从数据库中提取的用户对象的更改。使用此方法时,我总是最终得到 NotSupportedException:
已尝试附加或添加一个不是新的实体,可能是从另一个 DataContext 加载的。这是不支持的。
这是我尝试的方法:
public void SaveUser(User User)
{
using (DataContext dataContext = new DataContext(WebConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
// New user
if (User.UserID == 0)
{
dataContext.Users.InsertOnSubmit(User);
}
// Existing user
else
{
User dbUser = dataContext.Users.Single(u => u.UserID.Equals(User.UserID));
Type t = dbUser.GetType();
foreach (PropertyInfo p in t.GetProperties())
{
if (p.CanWrite & p.GetValue(dbUser, null) != p.GetValue(User, null))
{
p.SetValue(dbUser, p.GetValue(User, null), null);
}
}
//dataContext.Refresh(RefreshMode.KeepCurrentValues, dbUser);
}
dataContext.SubmitChanges();
}
}
我试过的注释掉的行也没有注释,但这没有帮助。
如果我注释掉 foreach() 循环并添加一行 dbUser.UserName = "Cheese"; 它会更新数据库中的用户名。这使我相信这是因为 foreach() 循环如何更改导致此失败的 dbUser 对象。
当我调试 dbUser 对象时,它似乎正确地获取了作为参数传递的 User 对象的所有更改。
我还阅读了一些关于乐观并发的内容,并在数据类型时间戳的表中添加了一列,但这似乎也没有任何效果。
我在这里到底做错了什么?
我怎样才能让它一般地检测到发生了什么变化并正确地将更改保存到数据库中?