2012-01-12 51 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