8

मेरे पास एक सारणी है जो संदर्भित करती है, लेकिन मैं अपनी वांछित मैपिंग प्राप्त करने के लिए संघर्ष कर रहा हूं। मैं बच्चों को उन लोगों का संग्रह करने में सक्षम होना चाहता हूं जिनके पास माता, पिता, और/या अभिभावक के रूप में दिया गया व्यक्ति है। एक अभिभावक पिता या मां हो सकता है।कई माता-पिता गुणों के साथ ईएफ 6 स्वयं संदर्भ तालिका, एकल बाल संग्रह

मैं उन लोगों का वृक्ष दृश्य देखना चाहता हूं जो ब्राउज़ करने योग्य हैं जहां लोग सूचीबद्ध हैं; उपयोगकर्ता बच्चे के परिभाषित रिश्ते (माता, पिता, या अभिभावक) को ध्यान में रखते हुए, उस व्यक्ति के बच्चों को दिखाने के लिए किसी व्यक्ति के नोड का विस्तार कर सकता है।

public partial class Person 
{ 
    [Key] 
    public int ID { get; set; } 

    [StringLength(100)] 
    public string Name { get; set; } 


    public int? GuardianID { get; set; } 

    [Column("MotherID")] 
    public int? MotherID { get; set; } 


    [Column("FatherID")] 
    public int? FatherID { get; set; } 

    [ForeignKey("MotherID")] 
    public virtual tblPerson Mother { get; set; } 

    [ForeignKey("FatherID")] 
    public virtual tblPerson Father { get; set; } 

    [ForeignKey("GuardianID")] 
    public virtual tblPerson Guardian { get; set; } 

    [InverseProperty("Guardian")] 
    [InverseProperty("Father")] 
    [InverseProperty("Mother")] 
    public virtual IEnumerable<tblPerson> children { get; set; } 
} 

किसी भी मदद की सराहना की जाएगी अभी मेरे विचार इस तरह दिखना चाहिए:

@using Person_MVC.Models 
    @model IEnumerable<Person> 
    @{ 
     IEnumerable<Person> children; 
    } 

    <ul> 
     @foreach (Person person in Model.OrderBy(p => p.PersonNumber)) 
     { 
      <li id="[email protected]" data-jstree='{"type":"Person"}' data-Personkey="@Person.ID.ToString()"> 
       @Person.Name 
       @{ 
      PersonModel db = new PersonModel(); 
      children = (from p in db.Persons where p.GuardianID == Person.ID || p.Father == Person.ID || p.MotherID == Person.ID select p).ToList(); 
       } 
       @if (children != null && children.Count() > 0) 
       { 
        @Html.Partial("PersonTree", children) 
       } 
      </li> 
     } 
    </ul> 

उत्तर

5

मुझे लगता है कि बेहतर समाधान आपके मॉडल में तीन नेविगेशन सूचियां बनाना है और आपके सभी बेटों को वापस करने के लिए वस्तुओं में शामिल होने का एक तरीका हो सकता है।

उदा।

public int? FatherId { get; set; } 

public int? GrandFatherId { get; set; } 

public int? MotherId { get; set; } 

public virtual ICollection<Person> FatherForThose { get; set; } 
public virtual Person Father { get; set; } 

public virtual ICollection<Person> GrandFatherForThose { get; set; } 
public virtual Person GrandFather { get; set; } 

public virtual ICollection<Person> MotherForThose { get; set; } 
public virtual Person Mother { get; set; } 


public ICollection<Person> GetChildren() 
{ 
    var list = FatherForThose.Concat(MotherForThose).ToList(); 
    foreach (var person in GrandFatherForThose) 
    { 
     if (list.All(i => i.Id != person.Id)) 
     { 
      list.Add(person); 

     } 
    } 
    return list; 
} 

लेकिन आप हमेशा उन्हें अपने क्वेरी करने उदा में शामिल करने के लिए ध्यान रखना चाहिए

var grand = context.Persons.Include(x => x.FatherForThose) 
      .Include(x => x.GrandFatherForThose) 
      .Include(x => x.MotherForThose) 
      .FirstOrDefault(x => x.Id == 2); 

var list = grand.GetChildren(); 
1
  1. सभी तालिका डेटा हाथ में होना चाहिए (हम डेटाबेस के लिए कई कॉल हो सकता है यदि नहीं) ।
  2. उन सभी व्यक्तियों की सूची खोजें जिनके माता-पिता नहीं हैं (यानी कोई अभिभावक, मातृभाषा, किसी व्यक्ति के लिए अभिभावक) और उनके साथ आंशिक प्रारंभ करें।
0

कोशिश कर सकते हैं यह भी ...

public partial class Person 
    { 
     [Key] 
     public int ID { get; set; } 

     [StringLength(100)] 
     public string Name { get; set; } 


     public int? GuardianID { get; set; } 

     [Column("MotherID")] 
     public int? MotherID { get; set; } 


     [Column("FatherID")] 
     public int? FatherID { get; set; } 

     public IEnumerable<Person> Children { get 
       { 
        return context.Person.Where(p => p.GuardianID == this.ID || p.Father == this.ID || p.MotherID == this.ID).ToList(); 
       } 
     } 
    } 





@using Person_MVC.Models 
    @model IEnumerable<Person> 

    <ul> 
     @foreach (Person person in Model.OrderBy(p => p.PersonNumber)) 
     { 
      <li id="[email protected]" data-jstree='{"type":"Person"}' data-Personkey="@Person.ID.ToString()"> 
       @Person.Name 

       @if (Person.Children != null && Person.Children.Count() > 0) 
       { 
        @Html.Partial("PersonTree", Person.Children) 
       } 
      </li> 
     } 
    </ul> 
संबंधित मुद्दे