2014-11-07 159 views
1
public class Parent { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Child ChildField { get; set; } 
} 

public class Child { 
    public int Id { get; set; } 
    public int Age { get; set; } 
    public int ParentId { get; set; } 
} 

public class MyDbContext : DbContext { 
    public DbSet<Parent> Parents { get; set; } 
    public DbSet<Child> Childs { get; set; } 
} 

DB Rows: 

parent_id | name 
1   "Parent 1" 
2   "Parent 2" 

Child Rows 
child_id | age | parent_id 
3   15  1 
4   21  2 

我有一個看起來像這樣的方法:實體框架加載子與父母

public Parent Get(int parentId) { 
    var result = this.dbContext.Parents 
     .Join(
      this.dbContext.Childs, 
      p => p.Id, 
      c => c.ParentId, 
      (p, c) => new { Parent = p, Child = c }) 
      .AsNoTracking().Where(m => m.Parent.Id == parentId) 
      .FirstOrDefault() 

    result.Parent.Child = result.Child; 
    return result.Parent; 
} 

目前這個工作對我來說,但我想不會有孩子手動分配到父母加入後。

  1. 有沒有更好的方法來做到這一點?我想使用相同的語法風格。
  2. 如何在不必手動將孩子分配給父母的情況下完成此操作?

謝謝!

+0

這是代碼優先? – 2014-11-07 03:45:07

+0

這不是代碼第一。 – 2014-11-07 14:41:06

回答

0

只要寫:

var result = this.dbContext.Parents.Where(m => m.Parent.Id == parentId) 
    .Include(p=>p.Child).FirstOrDefault() 

結果將包含相應的兒童的

+0

我原本是這麼做的,但是我得到一個錯誤「無效的列Child_Id」......孩子的主鍵在父表的表中不存在。父級的主鍵在子表中作爲外鍵存在。 – 2014-11-07 14:40:30

+0

您使用EF 6嗎? – Seb 2014-11-07 14:56:43

+0

你可以嘗試添加'[ForeignKey(「ChildField」)] \ n public int? Child_Id {get;組; } '之前'公共Child ChildField {獲取;組; }' – Seb 2014-11-07 14:59:45

1

的包括...

FatherRepository.All().Including(x => x.Childs, x => x.Childs.Select(y => y.ChildChild)); 

父類...

public class Father 
{ 
    public int Id { get; set; } 

    #region Navigations Properties 
    public virtual List<Child> Childs { get; set; } 
    #endregion 
} 

子類。 ..

public class Child 
{ 
    public int Id { get; set; } 
    public int ChildChildId { get; set; } 
    public int FatherId { get; set; } 

    #region Navigations Properties 
    public virtual Father Father { get; set; } 
    public virtual ChildChild ChildChild { get; set; } 
    #endregion 

} 

ChildChild類...

public class ChildChild 
{ 
    public int Id { get; set; } 
}