【问题标题】:Can't get Database to update using Repository Pattern and LINQ to SQL无法使用存储库模式和 LINQ to SQL 更新数据库
【发布时间】:2010-06-28 18:14:40
【问题描述】:

我的项目有以下设置

Controller -> Service(用于验证)-> Repository(用于 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

问题是它没有得到更新。我一定在这里做一些非常愚蠢的事情。任何建议将不胜感激。

【问题讨论】:

    标签: asp.net-mvc linq repository


    【解决方案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 正在跟踪该 User 实例,以了解属性是否已更改。因此,在 linq 语句之后,_user 被数据上下文知道并且可以被跟踪。当您将用户参数分配给对象 (_user = user) 时,您将丢失对跟踪对象的引用,并将其替换为未跟踪对象。您可以单独更新包含来自数据库的信息的_user 变量,或者尝试将用户参数附加到数据上下文并直接使用它(dc.Users.Attach(user))。附加可能很复杂,因为如果您没有相同的数据上下文实例,它将无法正确附加。下面是我的做法。

    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 
    

    【讨论】:

    • 我绝对可以单独更新对象,但是如何将用户参数附加到数据上下文?
    • With 语句是正确的方法。我已经这样做了,更新除了适用于从控制器传递的isProfileCompleteReputation 信息。我也应该在那里创建一个新的用户对象吗?
    • 我不明白为什么 isProfileComplete 和 Reputation 属性不同。
    • 我想出了一个。我在视图表单中没有任何字段保留这些值。
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多