2010-06-28 10 views
0

를 SQL로 저장소 패턴 및 LINQ를 사용하여 업데이트하는 데이터베이스를 가져올 수 없습니다내 프로젝트는 다음과 같은 설정을 가지고

컨트롤러 ->서비스 (검증) ->저장소 (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 

문제는 업데이트 점점 아니에요 것입니다. 내가 여기서 바보 같은 짓을하고있을거야. 모든 조언을 크게 주시면 감사하겠습니다.

답변

0
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 
+0

개체를 개별적으로 업데이트 할 수는 있지만 사용자 매개 변수를 데이터 컨텍스트에 연결하는 방법은 무엇입니까? –

+0

With 문은 적절한 방법입니다. 나는 그것을했고 업데이트는 ** isProfileComplete'와 ** 평판 ** 정보가 컨트롤러에서 전달 된 것을 제외하고는 ** 작동한다. 거기에 새로운 사용자 개체를 만들어야합니까? –

+0

isProfileComplete 및 Reputation 속성이 다른 이유를 알지 못합니다. – NerdFury

관련 문제