【问题标题】:How To Update Data With Linq By Attach Method如何通过 Attach 方法使用 Linq 更新数据
【发布时间】:2008-12-12 17:42:43
【问题描述】:

我的数据层中有一个更新方法,如下所示:

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)

当我运行它时,我收到以下错误消息:无法附加已存在的实体。

如何解决?

【问题讨论】:

    标签: asp.net linq


    【解决方案1】:

    解决此问题的最简单方法是在检索用户对象和更新时使用相同的 DataContext。

    一般来说,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);
    }
    

    Brian Orrell has a pretty good run-down 您遇到的问题,如果您想深入挖掘。

    【讨论】:

      【解决方案2】:

      如果您从中检索用户对象的 DataContext 尚未断开或处置,我认为不需要调用 Attach()。 objUIData 的生命周期是什么?

      【讨论】:

      • 当试图将一个从一个 DataContext 创建的对象附加到另一个时,也会发生此错误。
      • 只要 datalayerSec_User 还在,您就不必进行任何附加操作。如果您启用了更改跟踪(我认为默认情况下)并且您所要做的就是调用提交更改,则会发生更新。
      【解决方案3】:

      我不知道你的问题的答案,我也遇到过同样的问题,但我采取了一个简单的策略来防止这些小问题。

      不要尝试附加/分离,而是尽快获取实际对象;这在网络场景中效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        相关资源
        最近更新 更多