【问题标题】:LINQ to SQL update entity that came from client side来自客户端的 LINQ to SQL 更新实体
【发布时间】: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


    【解决方案1】:

    用途:

    _db.LONGFORMs.Attach(_lfFromClient, true);
    

    这样您就可以附加已修改的实体。 见Table.Attach

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

    编辑: 如果您更喜欢使用 POST 数据更新实体,可以试试这个:

    [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();
    }
    

    【讨论】:

    • 我试过了,它说:如果实体声明了版本成员或没有更新检查策略,则只能附加为修改后的没有原始状态的实体。
    • 我刚刚编辑了我的答案。查看该相关问题。希望对您有所帮助!
    • 好的,建议的链接提供了 2 个选项。我喜欢尝试第二个,所以,我该如何“或者,您也可以从数据库中获取实体并使用 POSTed 实体中的数据对其进行更改,然后将其作为更改提交。” ???我的意思是,我有 _lfFromClient 并且我还可以生成另一个实体,但是如何将新实体中的值替换为 _lfFromClient 中的值?
    • 使用_db.LONGFORMs.Where(l => l.ID == _lfFromClient.ID).FirstOrDefault() 查找相关实体。然后根据 _lfFromClient 的字段更新该实体的所有字段。
    • 是的,我试过了,但它说:“无法使用已在使用的密钥添加实体。”由于两个实体显然具有相同的 PK
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多