2014-11-07 117 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; } 
}