父亲和孩子一对多的关系

时间:2013-01-06 00:01:13

标签: c# entity-framework

我有一个组织的成员表,有些成员是其他成员的子女。在父母的详细信息被提取时,我想将父亲或母亲与他们的孩子联系起来。我有这个想法,但似乎不起作用

public class IsParent
{
    [Key]
    public int PId { get; set; }
    [DisplayName("Parent")]
    public int MId { get; set; }
    public virtual Member Member { get; set; }    
    [DisplayName("Child")]
    public int MId { get; set; }
    public virtual Member Member { get; set; }    
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果针对Member实体存储了子ID和父ID,并且您在Member实体中设置了IsParent的导航属性(请删除其中一个重复项,如下所示) Trey Gramann),您应该能够访问您所追求的值(例如在您的控制器中),如下所示:

int childID = IsParent.Member.ParentID; 
//Assuming your ParentID in the member entity is called `ParentID`

int parentID = IsParent.Member.ChildID; 
//Assuming your ParentID in the member entity is called `ChildID`

这可能只是你需要做的。但是,您可能希望能够出于某种原因从Member导航属性访问这些属性 - 如果是这样,请继续阅读。

如果您已使用MemberChild的导航属性设置Parent实体,则应该能够使用以下内容获取ChildParent实体使用常规对象点表示法(这里我假设它们属于Person类型,但您的设置可能不同):

Person child = IsParent.Member.Child;
Person parent = IsParent.Member.Parent;

如果您想针对IsParent实体缓存这些内容,可以试试这个:

public class IsParent
{
    [Key]
    public int PId { get; set; }

    [DisplayName("ParentID")]
    public int ParentID { 
           get {
               return Member.ParentID;
           }; 
           set {
               Member.ParentID = value;
           };
    }

    [DisplayName("ChildID")]
    public int ChildID {
           get {
               return Member.ChildID;
           }; 
           set {
               Member.ChildID = value;
           };
    }

    public virtual Member Member { get; set; }    
}

如果您想直接从IsParent访问子级和父级实体,可以使用类似的方法:

   [DisplayName("Parent")]
    public Person Parent { 
           get {
               return Member.Parent;
           }; 
           set {
               Member.Parent = value;
           };
    }

    [DisplayName("Child")]
    public Person Child {
           get {
               return Member.Child;
           }; 
           set {
               Member.Child = value;
           };
    }

我对这种方法有一些顾虑 - 我无法保证设置方法能够可靠地工作(虽然我过去使用过这种方法,但我认为这取决于你如何设置你的存储库,可能导致意外的行为)。我还认为你最好只在成员实体上设置Child和Parent的导航属性,然后以我向你展示的第一种方式访问​​它们。

我是否可以强烈建议您阅读本教程,因为我认为这会为您解决问题 - http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

我还可以建议您将IsParent重命名为Parent,因为IsParent表示这是Boolean而不是实体POCO。

作为最终评论,是否有理由实际拥有Parent / IsParent实体?看起来,一旦你使用适当的导航属性设置Member实体,你可以直接使用它 - 否则你不必要地添加一个包装,这只会增加你的困惑。