2010-04-10 2 views
2

내가 가진 경우, 예를 들어, 많은 - 투 - 많은 사용자와 역할 테이블 사이 "RolesToUsers"라는 매핑 테이블, 여기에 내가 그것을 할 방법 :업데이트 대다 LinqToSQL과의 관계

// DataContext is db, usr is a User entity 
// newUserRolesMappings is a collection with the desired new mappings, probably 
// derived by looking at selections in a checkbox list of Roles on a User Edit page 
db.RolesToUsers.DeleteAllOnSubmit(usr.RolesToUsers); 
usr.RolesToUsers.Clear(); 
usr.RolesToUsers.AddRange(newUserRolesMappings); 

SQL 프로파일 러를 한 번 사용했는데 이것은 매우 지능적인 SQL을 생성하는 것으로 보입니다. 더 이상 매핑 관계에없는 행만 삭제하고 아직 관계에없는 행만 추가합니다. 그것이 맹목적으로 생각한대로 그것은 관계의 완전한 청산 및 재건을하지 않습니다.

인터넷은 놀라 울 정도로 조용하고 "LinqToSQL many-to-many"쿼리는 대부분 LinqToSQL 데이터 매퍼가 어떻게 잘 "지원"하지 않는지에 대한 기사를 보여줍니다.

다른 사람들은 어떻게 LinqToSQL을 사용하여 many-to-many를 업데이트합니까?

+2

기술적으로, 그건 정말 당신이 수동으로 테이블을 조인 삭제되기 때문에 다 대다의 ORM에 해당하지 않습니다. ORM에서 m2m에 대한 "적절한"지원은 User 객체가 "Roles"라는 속성 (또는 컬렉션)을 갖도록 모델링하므로 ORM은 커버 아래에서 조인 테이블을 편집 할 수 있습니다. – RobS

+0

적어도 내 해석은 어쨌든 .. HIH – RobS

+1

@RobS : agree. 또한 내 해석 : 특정 사용자 한 명만 신경 쓴다면 '사용자'개체 '역할'컬렉션을 살펴볼 수 있습니다. 하나의 특별한 역할에 관심이 있다면, '역할'객체의 사용자 컬렉션을 살펴보십시오. ORM이라는 아이디어가 DB 물건을 숨기고 개체를 사용하는 것처럼 사용할 수 있습니다. –

답변

2

관계는 일련의 사실입니다. Users, RolesUsersToRoles은 모두 관계이며 하나를 다른 것보다 "일류"로 취급하는 것은 논리적으로 타당하지 않습니다. 당신이하고있는 일은 완벽하게 이해가됩니다. 그래서 매우 친절하게 일하는 것 같습니다.

ORM 세계는 SQL보다 훨씬 나쁜 관계형 모델입니다. 특히 관계형 데이터베이스는 객체 컬렉션을 저장한다는 오류를 제도화합니다. 그들은하지 않는다. 그들은 일련의 사실들을 저장한다. 사실 대부분은 엔티티입니다. 이것이 오류가 너무 매력적인 이유입니다. 그러나 많은 사실은 구성원 자격, 사건, 상태, 의견, 거래, 변경, 비교, 역사 등과 같은 많은 다른 종류의 개념에 관한 것입니다. 사용자가 특정 역할을 채택 할 때 어떤 점에서

  1. , 당신은 표시 할 수 있으며, 그 역할은 승인 대기 중입니다 아마 여부, 또는 일시적으로 취소 :

    또한 고려한다. 데이터 모델에서 표현하고자하는 모든 "관계"가 다 대 다 관계를 구성하는 두 개의 외래 키를 초과하는 페이로드를 전달한다는 것을 알게되었습니다. OR 매핑이 many-to-many를 숨기도록 설정 되었다면 엔티티로의 전환이 코드 분할과 관련하여 매우 어려움을 알 수 있습니다.

  2. 자주 관계가 바이너리보다 복잡합니다. "교수 P는 수업 C에서 교과서 T를 사용합니다." 교수 객체의 일부 컬렉션 속성 뒤에 숨기 쉽지 않은 환원 불가능한 삼원 관계 일 수 있습니다.
    • 몇 분 전에 정확히이 문제가 SO question으로 나타났습니다. JPA 2.0이 3 진 관계에 대한 지원을 명시 적으로 추가해야한다는 질문에서 나타납니다 (4 진 등 관계를 처리합니까?).
+1

물론 그 사람을 위해,하지만 당신은 오히려 사용자 개체를 가져오고 역할 컬렉션을 업데이 트해야한다고 생각하지 않아 ORM은 조인 테이블 로직을할까요? 적어도 그는 ORM을 사용합니다. 왜 그 기능을 사용하지 않아야합니까? –

+0

당신은 데이터베이스 수준에서의 관계에 대해 옳았 습니다만, 스키마 위/외부의 추상화/계층에 대해서는 동의하지 않습니다. UsersToRoles 테이블은 컨텍스트 외부에서 쓸모가 없습니다. 쿼리 가능성은 어느 정도입니까? 그 테이블 만으로요? – RobS

+0

@RobS, 매우 가능성이 있습니다. 첫째, 위의 두 점을 유의하십시오. 두 번째로, UsersToRoles는 자체적으로 쿼리하여 역할 당 사용자 수 또는 5 개 이상의 역할을 가진 사용자 수 또는 3 개 이상의 역할을 공유하는 사용자 수와 같은 집계를 작성할 수 있습니다. 이 마지막 질문은 일반적인 ORM에서 대답하는 것이 매우 어색합니다. –

1

이것은 귀하의 질문에 대한 답변이 아니며 그 이유에 대해 '인터넷은 그 주제에 대해 놀랍도록 조용합니다'라고 대답 할 수 있습니다. 개의 항목을 업데이트/삭제/추가하면됩니다. -to-n 관계이므로 자신이 가지고있는 질문을 스스로에게 묻지 않아도됩니다.

'사용자'와 '역할'테이블이 두 개 있고 용도가 사용자에게 /에서 역할을 추가/삭제하는 것과 같습니다.

궁금한 점이 있습니다 : 어떤 애플리케이션에서 예제와 같이 전체 매핑을 업데이트해야합니까?

+0

우리가 사용하는 응용 프로그램의 몇 가지 예가 있지만이 중 하나를 사용합니다 : 원래 질문의 예와 같이 User, Roles, RolesToUsers 설정이 있습니다. 사용자가 속한 역할을 편집하는 경우 관리 콘솔의 사용자 편집 페이지에 확인란 목록이 있습니다. 각 확인란은 역할을 나타냅니다. 따라서 사용자가 이전에 어떤 역할을했는지, 관리자가 사용자를 편집하는 "제출"을 누르면 관리자가 사용자에게 맡길 수있는 새로운 역할 목록이 표시됩니다. –

+0

이제 호기심이 생깁니다. LinqToSQL에서 보이는 것은 무엇입니까? (이것을 가정한다면)? 삭제할 n-to-n 매핑 테이블 행의 ID를 이미 알고 있다고 말할 수 있습니까? 그리고 추가 작업을 수행 할 때 항상 n-to-n 관계에 한 행만 추가하는 것입니까? –