这里有大量的信息,但即使在阅读了几个小时和几个小时之后,我似乎也无法按照我想要的方式工作。Linq to Sql - 如何使用存储库模式更新对象?
我试图更新一个用户对象,通过传递一个用户对象,并一般地比较用户对象的变化,我拉出数据库。我总是最后使用此方法时得到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对象的所有更改。
我也对乐观并发做了一些阅读,并在数据类型时间戳表中添加了一列,但这似乎也没有任何影响。
我究竟在做什么错在这里?
我怎样才能得到这个一般性地检测到什么已经改变,并正确地坚持对数据库的更改?
这看起来不错,但我建议使用`SubmitChanges()`作为自己的方法。通过这种方式,您可以在提交数据之前堆积几个数据库调用。 – 2011-01-30 00:23:56
是的,我完全同意SubmitChanges()它自己的方法。以上只是该模式的快速伪代码。我也会让我的资源库将通用方法暴露给服务层。如果@Sgraffite愿意,我可以扩展更多。 – mfanto 2011-01-30 00:45:13