2012-01-12 189 views
1

我一直花費數小時試圖找出答案,查看其他帖子,但沒有任何東西可以幫助我解決這個問題。實體框架4.1多對多自引用關係有效載荷問題

目標是我想跟蹤組織中的其他人與我們組織中的人的關係。

我有兩個表

  1. Persons

  2. Person_Person與用於第一和第二人的ID和稱爲關係類型一個額外的列。

我想有一個人的導航屬性來訪問所有與他人的關係。

出於某種原因,當我嘗試做

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 2012-01-12 23:59:23

+0

「關係」屬性參與的關係的另一端是什麼?當您將新實例添加到集合時,它將導致新行。 – Eranga 2012-01-13 00:07:22

+1

「在飛行中」寫下問題並不好。你的問題總是混亂。如何將一個名爲'Person_Person'的未知類添加到保存「Relationship」類型對象的集合?如何將一個'person2'(它可能是一個Person,或者如果沒有,有一個奇怪的名字,誰知道)添加到Relationships集合中?什麼是「額外的一排」?你仍然沒有澄清這一點。如果你想要一個有用的答案,請在你的問題上花點功夫,不要讓人們猜測你有什麼問題。現在我正在投票結束這個問題,因爲很難說出這裏提出的問題。 – Slauma 2012-01-13 14:58:04

回答

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 Person 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    // Add whatever else you want. 
} 

然後創建你的DbContext類:

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

在你的倉庫,你創建一個像這樣的新關係:

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

假設我想要一個名爲關係的集合,我將如何去做這件事 – DevTeamExpress 2012-01-13 07:49:17

+0

@DevTeamExpress - 看看我的編輯。希望有所幫助。 – JasCav 2012-01-13 12:25:26

+0

有兩個問題:1)您的AddRelationship方法將創建兩個新人,而不僅僅是關係。您必須將'person1'和'person2'附加到您用於創建關係的上下文'db',或者 - 如果'person1'和'person2'已經連接到另一個上下文 - 使用相同的上下文並且不創建新的一。 2)'Person.Relationships'會導致麻煩,因爲'Relationship'有*兩個*引用'Person'的導航屬性。 EF將不會檢測到正確的逆向屬性,並會創建* 3個*關聯,這些關聯可能不代表正確的模型。 – Slauma 2012-01-13 15:05:48