【发布时间】:2011-08-24 10:00:19
【问题描述】:
我有通过 AJAX 传递到客户端的实体 (LONGFORM)。该实体在客户端被修改,并被发送回服务器以在数据库中更新。这是服务器端代码:
[System.Web.Services.WebMethod()]
public static LONGFORM SendDataToClient(int id)
{
DBDataContext _db = new DBDataContext();
LONGFORM _lf = _db.LONGFORMs.SingleOrDefault(l => l.IDLONGFORM == id);
return _lf;
}
[System.Web.Services.WebMethod()]
public static void SaveDataFromClient(LONGFORM _lfFromClient)
{
DBDataContext _db = new DBDataContext();
//_db.LONGFORMs.InsertOnSubmit(_lfFromClient);
_db.LONGFORMs.Attach(_lfFromClient);
_db.SubmitChanges();
}
但我无法将 _lfFromClient (LONGFORM) “更新”回数据库! 如果我使用 InsertOnSubmit 记录将被插入(尽管 LINQ 应该看到 PK 字段已经存在于表中,因此尝试更新)。如果我使用“附加”方法,则不会发生任何事情。
那么,更新与当前 DataContext 无关的实体的正确方法是什么?
谢谢。-
编辑:我设法更新了 LONGFORM 中的值,在 SubmitChanges() 之前添加了这一行: _db.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, _lfFromClient);
现在的问题是 _lfFromClient 中的子实体不会得到更新:(
编辑 2: 好的,我找到了解决方案,所以这是答案,希望它能帮助遇到同样问题的人。诀窍是还附加所有子实体,因为 LINQ 不会自动执行此操作。在此示例中,FAMILYMEMBER 是 LONGFORM 的子实体集合,它也在客户端获得更新。请注意“AttachAll”,因为 LONGFORM -> FAMILYMEMBER 是一对多关系:
[System.Web.Services.WebMethod()]
public static void SaveData(LONGFORM _lfFromClient)
{
DBDataContext _db = new DBDataContext();
_db.LONGFORMs.Attach(_lfFromClient);
_db.FAMILYMEMBERs.AttachAll(_lfFromClient.FAMILYMEMBERs);
_db.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, _lfFromClient);
_db.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, _lfFromClient.FAMILYMEMBERs);
_db.SubmitChanges();
}
【问题讨论】:
标签: c# linq-to-sql