asp.net - 如何通过 Attach 方法使用 Linq 更新数据

标签 asp.net linq

我的数据层中有一个这样的更新方法:

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。

一般来说,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如果您想深入挖掘,请查看您遇到的问题。

关于asp.net - 如何通过 Attach 方法使用 Linq 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/363570/

相关文章:

asp.net - 从 webforms 页面以编程方式调用 asp.net mvc Controller 操作

c# - 是否可以为字符串实现 ExpressionTree.GreaterThan 等,以便 LINQ 可以使用它

c# - 对 List<string> 进行排序,如 Excel 列排序

c# - 是否可以按 groupby 中不存在的列进行排序?

c# - SQL Server Profiler 中的 "Audit Logout"是什么?

c# - 带有扩展的 ASP.NET Webforms 路由

asp.net - 当我在 gridview 中进行排序时,会触发 Gridview RowCommand 事件

javascript - 将 Javascript 结果传递给 View

c# - Paypal 沙箱与 asp.net c# 集成

C# 读取 XML 元素和文本