C# 来自客户端的LINQ到SQL更新实体

C# 来自客户端的LINQ到SQL更新实体,c#,linq-to-sql,C#,Linq To Sql,我有一个实体(LONGFORM),它通过AJAX传递给客户端。该实体在客户机上被修改,并被发送回服务器,以便在数据库中进行更新。以下是服务器端代码: [System.Web.Services.WebMethod()] public static LONGFORM SendDataToClient(int id) { DBDataContext _db = new DBDataContext(); LONGFORM _lf = _db.LONGFORMs.SingleOrDefau

我有一个实体(LONGFORM),它通过AJAX传递给客户端。该实体在客户机上被修改,并被发送回服务器,以便在数据库中进行更新。以下是服务器端代码:

[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();
}
但是我不能将\u lfFromClient(LONGFORM)重新“更新”到数据库中! 如果我使用InsertOnSubmit,记录将被插入(尽管LINQ应该看到PK字段已经存在于表中,因此尝试更新)。如果我使用“附加”方法,什么都不会发生

那么,更新与当前DataContext无关的实体的正确方法是什么

谢谢-

编辑:我在提交更改()之前添加了这一行,成功地更新了LONGFORM中的值: _db.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues,_lfFromClient)

现在的问题是_lfFromClient中的子实体无法更新:(

编辑2:好的,我找到了解决方案,所以下面是答案,希望它能帮助有同样问题的人。诀窍是附加所有子实体,因为LINQ不会自动附加。在本例中,FAMILYMEMBER是LONGFORM的子实体集合,在客户端也会得到更新。请注意“Attachal”由于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();

    }
使用:

通过这种方式,可以将图元附着为修改后的图元。 看

如果这种方法给您带来任何问题,请查看

编辑: 如果希望使用发布的数据更新实体,可以尝试以下操作:

[System.Web.Services.WebMethod()]
public static void SaveDataFromClient(LONGFORM _lfFromClient)
{
    DBDataContext _db = new DBDataContext();
    var _lfFromDB = _db.LONGFORMs.Where(l => l.ID == _lfFromClient.ID).FirstOrDefault();
    // Update all the properties of _lfFromDB here. For example:
    _lfFromDB.Property1 = _lfFromClient.Property1;
    _lfFromDB.Property2 = _lfFromClient.Property2;
    _db.SubmitChanges();
}

我试过了,它说:如果一个实体声明了版本成员或没有更新检查策略,那么它只能被附加为修改而没有原始状态。我刚刚编辑了我的答案。检查一下相关的问题。希望有帮助!好吧,建议的链接提供了两个选项。我想尝试第二个,那么,我该怎么做“或者,您也可以从数据库中获取实体,并使用发布实体中的数据对其进行更改,然后将其作为更改提交。“???我的意思是,我有lfFromClient,我还可以生成另一个实体,但是我如何用lfFromClient中的值替换新实体中的值?用
\u db.LONGFORMs.Where(l=>l.ID==\u lfFromClient.ID).FirstOrDefault()查找相关实体
。然后根据_lfFromClient的字段更新该实体的所有字段。是的,我尝试过,但它说:“无法添加具有已使用密钥的实体。”因为两个实体显然具有相同的PK
[System.Web.Services.WebMethod()]
public static void SaveDataFromClient(LONGFORM _lfFromClient)
{
    DBDataContext _db = new DBDataContext();
    var _lfFromDB = _db.LONGFORMs.Where(l => l.ID == _lfFromClient.ID).FirstOrDefault();
    // Update all the properties of _lfFromDB here. For example:
    _lfFromDB.Property1 = _lfFromClient.Property1;
    _lfFromDB.Property2 = _lfFromClient.Property2;
    _db.SubmitChanges();
}