Entity framework 实体框架4.1多对多自引用关系有效负载问题

Entity framework 实体框架4.1多对多自引用关系有效负载问题,entity-framework,Entity Framework,我花了好几个小时试图找出这个问题的答案,查阅了其他帖子,但没有任何东西能帮我解决这个问题 我的目标是跟踪组织中人员与组织中其他人员的关系 我有两张桌子 人员 Person\u Person带有第一个和第二个人物的ID以及一个名为relationship type的额外列 我想在persons上有一个导航属性,以访问与其他人的所有关系 因为某种原因,当我尝试 newperson.Relationships.add(new Person_Person(){Person1= person}); 我多

我花了好几个小时试图找出这个问题的答案,查阅了其他帖子,但没有任何东西能帮我解决这个问题

我的目标是跟踪组织中人员与组织中其他人员的关系

我有两张桌子

  • 人员

  • Person\u Person
    带有第一个和第二个人物的ID以及一个名为relationship type的额外列

  • 我想在persons上有一个导航属性,以访问与其他人的所有关系

    因为某种原因,当我尝试

    newperson.Relationships.add(new Person_Person(){Person1= person});
    
    我多排了一排

    有点不对劲,请帮我解决一下

    更新#1

    好的,让我澄清一下,我有一个叫person的班级

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

    我希望能够做两件事,一是能够通过relationships集合通过do添加Relationship

    Person newperson = new Person();
    newperson.Relationships.add(person2);
    
    这将产生一个额外的行

    另一个是如果我通过关系表添加此人,例如

    Relationship relationship= new Relationship();
    relationship.person1= person1;
    relationship.person2= person2;
    relationship.relationshiptype="father";
    db.Relationships.add(relationship);
    
    这是可行的,但我希望它出现在特定人物的关系中


    我如何做到这一点我希望我能够澄清我知道代码在语法方面不是完美的,我是动态编写的。但是请帮我解释一下逻辑。

    也许我不明白你想做什么,但你似乎有点过于复杂了

    创建一个关系类,如下所示:

    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.
    }
    
    public class Person
    {
      public int PersonID { get; set; }
      public string Name { get; set; }
      // Add whatever else you want.
    }
    
    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();
      }
    }
    
    Person类将如下所示:

    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.
    }
    
    public class Person
    {
      public int PersonID { get; set; }
      public string Name { get; set; }
      // Add whatever else you want.
    }
    
    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();
      }
    }
    
    然后创建DbContext类:

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

    你所要做的就是从任何需要它的类(你的控制器或任何东西)调用AddRelationship。

    也许我没有得到你想要做的,但你似乎有点过于复杂了

    创建一个关系类,如下所示:

    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.
    }
    
    public class Person
    {
      public int PersonID { get; set; }
      public string Name { get; set; }
      // Add whatever else you want.
    }
    
    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();
      }
    }
    
    Person类将如下所示:

    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.
    }
    
    public class Person
    {
      public int PersonID { get; set; }
      public string Name { get; set; }
      // Add whatever else you want.
    }
    
    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();
      }
    }
    
    然后创建DbContext类:

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

    您所要做的就是从任何需要它的类(您的控制器或任何类)调用AddRelationship。

    额外的行在哪里?您能向我们提供关于上述行的更多详细信息吗?
    Relationships
    property参与的关系的另一端是什么?当你向集合中添加一个新实例时,它将产生一个新行。在“运行中”写问题是不好的。你的问题一片混乱。如何将名为
    Person\u Person
    的未知类添加到包含
    关系类型的对象的集合中?如何将
    person2
    添加到关系集合中(它是
    ,或者,如果不是,有一个奇怪的名字,谁知道呢)?什么是“额外的一排”?你仍然没有澄清这一点。如果你想要一个有用的答案,请在你的问题上投入一些精力,不要让人们猜测你有什么问题。现在我投票结束这个问题,因为很难说这里要问什么。额外的一排在哪里?您能向我们提供关于上述行的更多详细信息吗?
    Relationships
    property参与的关系的另一端是什么?当你向集合中添加一个新实例时,它将产生一个新行。在“运行中”写问题是不好的。你的问题一片混乱。如何将名为
    Person\u Person
    的未知类添加到包含
    关系类型的对象的集合中?如何将
    person2
    添加到关系集合中(它是
    ,或者,如果不是,有一个奇怪的名字,谁知道呢)?什么是“额外的一排”?你仍然没有澄清这一点。如果你想要一个有用的答案,请在你的问题上投入一些精力,不要让人们猜测你有什么问题。现在,我投票结束这个问题,因为很难说这里要问什么。假设我想有一个名为“类人关系”的集合,我该如何做有两个问题:1)你的
    AddRelationship
    方法将创建两个新的人,而不仅仅是关系。您必须将
    person1
    person2
    附加到用于创建关系的上下文
    db
    ,或者-如果
    person1
    person2
    已附加到另一上下文-使用同一上下文,而不是创建新上下文。2)
    Person.Relationships
    将导致麻烦,因为
    Relationship
    有两个导航属性,它们都指向
    Person
    。EF将检测不到正确的反向属性,并将创建三个可能不代表正确模型的关联。@Slauma-很好的调用。(就像我说的,当我回答这个问题的时候已经是早上7点了。)我要删除它。老实说,我不明白他想通过把“关系”作为人的一部分来实现什么。(也许DevTeam可以回应。)我需要跟踪系统中的人之间的关系。当我加载一个人时,我希望能够看到他与其他人的所有关系,并将其加载到数据网格(WPF)中。斯劳玛说,我做到了,它起作用了,但它不起作用;重新定义反向,除非我通过颠倒顺序将其以另一种方式添加到数据库中。假设我想在类person上创建一个名为relationships的集合,我将如何执行此操作有两个问题:1)您的
    AddRelationship
    方法将创建两个新的人,而不仅仅是关系。您必须将
    person1
    person2
    附加到用于创建关系的上下文
    db
    ,或者-如果
    person1
    person2
    已附加到另一上下文-使用同一上下文,而不是创建新上下文。2)
    Person.Relationships
    将导致麻烦,因为
    Relationship
    有两个导航属性,它们都指向
    Person
    。EF将检测不到正确的反向属性,并将创建三个可能不代表正确模型的关联。@Slauma-很好的调用。(