Объект обновления LINQ to SQL, полученный со стороны клиента - PullRequest
0 голосов
/ 24 августа 2011

У меня есть сущность (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();
}

Но я не могу «обновить» _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();

    }

1 Ответ

0 голосов
/ 24 августа 2011

Использование:

_db.LONGFORMs.Attach(_lfFromClient, true);

Таким образом, вы присоединяете объект как измененный. См. Таблица. Присоединение

Если при таком подходе возникнут какие-либо проблемы, проверьте этот вопрос .

Изменить: Если вы предпочитаете обновить сущность данными POSTed, вы можете попробовать это:

[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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...