2012-01-12 2 views
1

나는이 문제에 대한 해답을 찾기 위해 여러 게시물을 검토하고 있지만 다른 게시물을 검토하는 데 아무런 시간도 들이지 않았습니다.Entity Framework 4.1 다 대다 셀프 참조 관계 페이로드 문제

목표는 우리 조직의 사람들과 조직의 다른 사람들과의 관계를 추적하고자하는 것입니다.

나는 두 테이블 1 및 제 2 사용자에 대한 ID 및 관계 타입이라는 추가 컬럼

  • Person_Person

  • Persons

      있다.

    다른 사람들과의 모든 관계에 액세스하는 사람에 대한 탐색 속성을 갖고 싶습니다. 어떤 이유

    은 내가

    newperson.Relationships.add(new Person_Person(){Person1= person}); 
    

    난 여분의 행을 취득 할 때.

    뭔가

    이 업데이트 # 1

    좋아, 내가 분명히하자 나를 밖으로이를 정렬 도와주세요 합산되지 않은 내가이 클래스라는 사람

    public class Person { 
           int personID; 
           string Name; 
           public virtual ICollection<Relationship> Relationships; 
    

    }

    public class Relationship { 
    
         int RelationshipID {get; set;} 
         public virtual Person person1{get; set;} 
         public virtual Person person2{get; set;} 
         public string relationshipType {get; set;} 
    

    }

    내가 두 가지 일을 할 수 있기를 원하는

    , 하나는이 여분의 행 결과

    Person newperson = new Person(); 
    newperson.Relationships.add(person2); 
    

    를 수행하여 관계 컬렉션을 통해 relationshp를 추가 할 수 있습니다.

    나는 관계 테이블을 통해 사람을 추가하면 다른 하나는 같은

    Relationship relationship= new Relationship(); 
    relationship.person1= person1; 
    relationship.person2= person2; 
    relationship.relationshiptype="father"; 
    db.Relationships.add(relationship); 
    

    이 작동하지만 난이 특정 사람이라는 관계에 표시 할 것입니다

    나는이 작업을 수행하려면 어떻게 나는 내가 코드를 완벽하게 구문 현명하지 내가 비행에 썼다는 것을 분명히 알 수 있었으면 좋겠다. 하지만 논리로 나를 도와주세요.

  • +0

    여분의 행은 어디에 있습니까? 행에 대한 자세한 정보를 제공해 주시겠습니까? – McKay

    +0

    'Relationships' 속성이 참여하는 관계의 다른 끝은 무엇입니까? 콜렉션에 새 인스턴스를 추가하면 새로운 행이 생깁니다. – Eranga

    +1

    "실시간으로"질문하는 것은 좋지 않습니다. 귀하의 질문은 총 혼란입니다. 'Person_Person'이라는 미지의 클래스를'Relationship' 타입의 객체를 가진 콜렉션에 어떻게 추가 할 수 있습니까? Relationships 컬렉션에'person2' ('Person' 또는 그렇지 않다면 이상한 이름을 가짐)를 어떻게 추가 할 수 있습니까? "추가 행"이란 무엇입니까? 너는 아직도 이것을 분명히하지 않았다. 유용한 대답을 원한다면 질문에 약간의 노력을 기울이십시오. 사람들이 당신에게 어떤 문제가 있는지 추측하지 마십시오. 지금은 질문을 끝내기 위해 투표를하고 있습니다. 왜냐하면 여기서 질문하는 것이 어렵 기 때문입니다. – Slauma

    답변

    1

    어쩌면 나는 당신이하려는 것을 얻지 못할 수도 있지만, 조금 복잡해지고있는 것처럼 보입니다.

    과 같이 관계 클래스를 만듭니다

    public class Relationship 
    { 
        public int RelationshipID { get; set; } 
    
        // Link the two people together. 
        public virtual Person Person1 { get; set; } 
        public virtual Person Person2 { get; set; } 
        // You could also add a RelationshipType or something along those lines if you choose. 
    } 
    

    Person 클래스는 다음과 같이 보일 것이다 : 저장소에서

    public class MyContext : DbContext 
    { 
        public DbSet<Person> People { get; set; } 
        public DbSet<Relationship> Relationships { get; set; } 
    } 
    

    :

    public class Person 
    { 
        public int PersonID { get; set; } 
        public string Name { get; set; } 
        // Add whatever else you want. 
    } 
    

    는 그런 다음 DbContext 클래스를 생성 다음과 같이 새 관계를 만듭니다.

    public class MyRepository 
    { 
        MyContext db = new MyContext(); 
    
        public void AddRelationship(Person person1, Person person2) 
        { 
        var relationship = new Relationship 
        { 
         Person1 = person1, 
         Person2 = person2 
        } 
    
        db.Relationships.Add(relationship); 
        db.SaveChanges(); 
        } 
    } 
    

    당신이해야 할 일은 AddRelationship을 어떤 클래스 (컨트롤러 등)에서든 호출해야한다는 것입니다.

    +0

    클래스 Person에 관계라고하는 콜렉션을 갖고 싶다면 어떻게해야할까요? – DevTeamExpress

    +0

    @DevTeamExpress - 제 편집을보세요. 희망이 도움이됩니다. – JasCav

    +0

    2 가지 이슈가 있습니다 : 1) 당신의'AddRelationship' 메소드는 관계뿐만 아니라 두 개의 새로운 사람을 생성 할 것입니다. 관계를 생성하기 위해 사용하고있는'db' 문맥에'person1'과'person2'을 첨부해야합니다. -'person1'과'person2'가 이미 다른 문맥에 첨부되어 있다면 - 동일한 문맥을 사용하고 새로운 문맥을 생성하지 말아야합니다 하나. 2) '관계'는 * 2 개의 탐색 속성이 '사람'을 참조하므로 'Person.Relationships'는 문제가 될 수 있습니다. EF는 올바른 역 특성을 감지하지 못하고 올바른 모델을 나타내지 않을 가능성이있는 * 3 * 연관을 생성합니다. – Slauma