[asp.net-mvc]无法获取数据库使用存储库模式和 LINQ to SQL 中的进行更新

发布时间: 2017/3/25 2:26:07
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我的项目有以下设置

控制器-服务(验证)-存储库(LINQ)- dbml -数据库>

控制器

''# <AcceptVerbs(HttpVerbs.Post)>  -  hiding this line so that code formatting looks proper in SO.
Function Edit(ByVal user As Domain.User, ByVal id As Integer) As ActionResult

    If ModelState.IsValid Then

        If Not String.IsNullOrEmpty(user.UserName) AndAlso _
            Not String.IsNullOrEmpty(user.WebSite) AndAlso _
            Not String.IsNullOrEmpty(user.Email) AndAlso _
            Not String.IsNullOrEmpty(user.About) AndAlso _
            Not user.Region Is Nothing AndAlso _
            Not user.BirthDate Is Nothing AndAlso _
            Not user.isProfileComplete = True Then

            user.isProfileComplete = True
            user.Reputation = user.Reputation + 10

            UserService.UpdateUser(user)

        Else
            UserService.UpdateUser(user)
        End If

        UserService.SubmitChanges()

        Return RedirectToAction("Details", "Users", New With {.id = id, .slug = user.UserName})
    Else
        Return View(user)
    End If
End Function

服务

    Public Sub UpdateUser(ByVal user As User) Implements IUserService.UpdateUser
        _UserRepository.UpdateUser(user)
    End Sub

    Public Sub SubmitChanges() Implements IUserService.SubmitChanges
        _UserRepository.SubmitChanges()
    End Sub

存储库

    Public Sub UpdateUser(ByVal user As User) Implements IUserRepository.UpdateUser
        Dim _user = (From u In dc.Users
            Where u.ID = user.ID
            Select u).Single
        _user = user
    End Sub

    Public Sub SubmitChanges() Implements IUserRepository.SubmitChanges
        dc.SubmitChanges()
    End Sub

问题是不得到更新。 在这里我必须做一些很愚蠢的事情。任何建议,将不胜感谢。

解决方法 1:

Public Sub UpdateUser(ByVal user As User) Implements IUserRepository.UpdateUser 
    Dim _user = (From u In dc.Users 
        Where u.ID = user.ID 
        Select u).Single 
    _user = user 
End Sub 

在此方法中,您从数据库获取用户。该用户实例是被 Linq2Sql 跟踪了解如果属性已更改。所以后 linq 语句 _user 已知的数据上下文,并且可以跟踪。当您将用户参数分配给该对象 ( _user = user ),你失去对跟踪的对象的引用,并替换未跟踪的对象。你也可以单独更新 _user 变量包含信息从数据库,或尝试将用户参数附加到数据上下文并直接使用,( dc.Users.Attach(user) )。附加可以很复杂,因为如果你没有比相同的 datacontext 实例不会绑定到正确。下面是会怎么做呢。

Public Sub UpdateUser(ByVal user As User) Implements IUserRepository.UpdateUser 
    Dim _user = (From u In dc.Users 
        Where u.ID = user.ID 
        Select u).Single 
    With _user
        .Name = user.Name
        .Email = user.Email
    End With
End Sub 
赞助商