Не удается получить базу данных для обновления с использованием шаблона репозитория и LINQ to SQL - PullRequest
0 голосов
/ 28 июня 2010

Мой проект имеет следующую настройку

Контроллер -> Сервис (для проверки) -> Репозиторий (для 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 Ответ

0 голосов
/ 28 июня 2010
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...