2010-04-23 3 views
0

다음 코드에서 GetUserAction은 작업 인스턴스를 반환하지만 사용자 인스턴스가 데이터베이스에 제출 될 때 반환되는 기존 행과의 관계를 만드는 대신 데이터베이스에 추가 작업 행을 만듭니다. 왜?Linq하려면 Sql 왜 내가 중복 레코드를 얻고 있습니까?

using (UserRepository repository = new UserRepository()) 
{ 
    var user = new user 
    { 
     user_created = DateTime.Now, 
     user_email = email, 
     user_password = GetHashedPassword(password)        
    }; 

    // create an entry in the users history 
    user.user_histories.Add(new user_history 
    { 
     user_history_date = DateTime.Now, 
     action = GetUserAction("Registered") 
    });       

    // commit the new user to the database 
    repository.InsertUser(user); 
    repository.Save(); 
} 

public static action GetUserAction(string userAction) 
{ 
    action a = null; 

    using (UserRepository repository = new UserRepository()) 
    { 
     a = repository.SelectUserAction(userAction); 

     // in the SO example I know a is not null so ignore the next 8 lines 
     if (a == null) 
     { 
      a = new action 
      { 
       action_name = userAction 
      };      
     } 
    } 

    return a; 
} 
+0

사용자를 저장하는 동일한 컨텍스트에서 사용자 작업을 검색하면 어떻게됩니까? – Gregoire

+0

@Gregoire 나는 그것을 시도하고 괜찮아요, 괜찮아요,하지만 나는 반환 된 작업이 새 것인지 기존인지 알 수있는 경우 @Daniel CS 대답이 작동하는 별도의 메서드로 UserAction 검색을 추출하고 싶습니다. –

답변

0

코드에서 user_history 및 동작이 외래 키 관계로 연결되어 있다고 추측 할 수 있습니다.

이 경우 Linq2SQL이 user_history의 필드로 작업을 제공하지만 새 user_history를 기존 작업과 연결해야하는 경우 작업의 기본 키를 반환하고 user_history에 관계 필드를 설정해야합니다 목적.

편집 : 작업의 기본 키가 ID 자동 생성 열인 경우 0과 비교하여 새 값인지 확인할 수 있습니다. 새 객체의 ID는 0으로 설정됩니다.

또는 새 동작 인 경우 GetUserAction을 데이터베이스에 삽입하도록 변경할 수 있습니다. 그렇게하면 데이터베이스에 이미 존재하는 작업을 항상 반환한다는 것을 보장 할 수 있습니다.

+0

볼 수 있습니다. 이것이 작동 할 것입니다 (비록 내가 후드에서의 이유를 이해할 수는 없지만). 그러나 호출 된 메소드로부터 리턴 된 액션이 새로운 것인지 아닌지를 결정할 수는 없습니다. 나는 new를위한 bool을 포함하는 객체를 리턴 할 수도 있고, 그렇지 않은 액션을 추가 할 수도있다. 그러나 그것은 틀린 것처럼 보인다. –

관련 문제