Как обновить данные с помощью Linq методом Attach

У меня есть метод обновления в моем слое данных, такой:

public clacc datalayerSec_User
private objUIData as new UIData
Public Function Update(ByVal objUser As SEC_USER) As Boolean
  Try
    objUIData.SEC_USERs.Attach(objUser)
    objUIData.Refresh(RefreshMode.KeepCurrentValues, objUser)
    objUIData.SubmitChanges(ConflictMode.ContinueOnConflict)
    Return True
  Catch ex As Exception
    Throw ex
  End Try
End Function
end class

И я пишу этот код для обновления моих данных:

Dim tmpUser As New UI_Class.BAL.Security.cls_SEC_USER
Dim tblUser = tmpUser.GetAll.SingleOrDefault(Function(x) x.DS_OPENID = pOpenID)
tblUser.DT_LAST_LOGIN = DateTime.Now
tmpUser.Update(tblUser)

Когда я запускаю его, у меня появляется это сообщение об ошибке: Не удается присоединить сущность, которая уже существует.

Как это можно исправить?

12.12.2008 17:42:43
3 ОТВЕТА
РЕШЕНИЕ

Самый простой способ обойти эту проблему - использовать один и тот же DataContext при получении объекта пользователя и обновлении.

В общем случае DataContext должен поддерживаться для «единицы работы», другими словами, вы используете его для извлечения любого объекта, который хотите изменить, затем изменяете его свойства, а затем просто выполняете SubmitChanges () для DataContext. Нет необходимости повторно присоединять объект к DataContext, поскольку он уже имеет ссылку на него.

У меня нет навыков работы с VB, но что-то вроде этого должно работать (обратите внимание: очень грубый псевдокод, такие вещи, как правильное удаление DataContext, рекомендуется):

class cls_SEC_USER
{
    private _UIData = new UIData();

    public User SingleOrDefault(int x)
    {
        return _UIData.Users.SingleOrDefault(y => y.UserId == x);
    }

    public void Update(User u)
    {
        _UIData.SubmitChanges();
    }
}

// ..........

cls_SEC_USER tmpUser = new cls_SEC_USER();  
User u = tmpUser.SingleOrDefault(4);

if(u != null)
{
    u.DT_LAST_LOGIN = DateTime.Now;
    tmpUser.Update(u);
}

У Брайана Оррелла есть довольно неплохое изложение проблем, с которыми вы сталкиваетесь, если вы хотите углубиться.

4
13.12.2008 12:01:31

Если DataContext, из которого вы получили объект пользователя, не был отключен или удален, я не думаю, что нужно вызывать Attach (). Каков жизненный цикл objUIData?

2
12.12.2008 17:45:11
Эта ошибка возникает при попытке присоединить объект, созданный из одного DataContext, к другому.
leppie 12.12.2008 17:48:07
Пока datalayerSec_User все еще существует, вам не нужно будет делать никаких вложений. Обновления будут происходить, если у вас включено отслеживание изменений (по-моему, по умолчанию), и все, что вам нужно сделать, это отправить изменения в вызов.
Zachary Yates 12.12.2008 18:20:54

Я не знаю ответа на ваш вопрос, и я застрял с той же проблемой, но я принял простую стратегию, чтобы предотвратить эти маленькие проблемы.

Вместо того, чтобы пытаться прикрепить / отсоединить, извлеките реальный объект как можно скорее; это хорошо работает в веб-сценариях.

0
12.12.2008 17:47:05