У меня есть метод обновления в моем уровне данных, такой:
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)
Когда я запускаю его, у меня появляется это сообщение об ошибке: Не удается прикрепить сущность, которая уже существует.
Как это исправить?





Если DataContext, из которого вы получили объект пользователя, не был отключен или удален, я не думаю, что нужно вызывать Attach (). Каков жизненный цикл objUIData?
Пока datalayerSec_User все еще существует, вам не нужно выполнять никаких подключений. Обновления будут происходить, если у вас включено отслеживание изменений (я думаю, по умолчанию), и все, что вам нужно сделать, это вызвать изменения для отправки.
Я не знаю ответа на ваш вопрос, и я тоже застрял с той же проблемой, но я принял простую стратегию, чтобы предотвратить эти небольшие проблемы.
Вместо того, чтобы пытаться прикрепить / отсоединить, как можно скорее получите фактический объект; это хорошо работает в веб-сценариях.
Самый простой способ обойти эту проблему - использовать один и тот же 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);
}
Брайан Оррелл довольно неплохо разбирается проблем, с которыми вы столкнулись, если вы хотите копнуть глубже.
Эта ошибка возникает при попытке прикрепить объект, созданный из одного DataContext, к другому.