2017-03-07 39 views
0

如何使用存储过程获取父级及其子级?实体框架6复杂对象的代码优先存储过程映射

我的代码的通用版本是这样的:

public class Parent 
{ 
    public Int32 ParentId { get; set; } 
    public Guid ParentGuid { get; set; } 
    public String Name { get; set; } 
    public virtual ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public Int32 ChildId { get; set; } 
    public String Name { get; set; } 
    public Int32 ParentId { get; set; } 
    public virtual Parent Parent { get; set; } 
} 

public class ParentMapping : EntityTypeConfiguration<Parent> 
{ 
    public ParentMapping() 
    { 
     ToTable("Parents"); 
     HasKey(t => t.ParentId); 
    } 
} 

public class ChildMapping : EntityTypeConfiguration<Child> 
{ 
    public ChildMapping() 
    { 
     ToTable("Children"); 
     HasKey(t => t.ChildId); 
     HasRequired(t => t.Parent).WithMany(t => t.Children); 
    } 
} 

我试图调用存储过程并获得父母的孩子们:

_context.Database.SqlQuery<Parent>("EXEC [dbo].[GetParent] @ParentGuid", new SqlParameter("@ParentGuid", parentGuid)).SingleOrDefault(); 

存储过程是一个简单的选择:

SELECT 
    P.*, 
    C.* 
FROM 
    [dbo].[Parents] P 
INNER JOIN 
    [dbo].[Children] C ON C.[ParentId] = P.[ParentId] 
WHERE 
    P.[ParentGuid] = @ParentGuid 

现在,它只是将父对象的数据映射到对象。 Children集合为空。我需要做些什么才能让这个人群充满?

回答

1

如果您使用context.Database.SqlQuery实体未跟踪,只是作为纯数据模型返回。如果你想解决孩子们(通过延迟加载),那么你需要的方式,还增加了对象EF对象图来查询它们:

_context.Set<Parent>().SqlQuery(...) 

通过运行针对DbSet它会跟踪SQL查询他们默认情况下,延迟加载现在应该工作。

+0

完全按照我想要的方式工作。谢谢! – ScubaSteve

+0

我遇到了一个问题,如果您有多个孩子,则该sproc会返回多行。因此,在代码中,我通常会'do _context.Set ().SqlQuery()。SingleOrDefault();'由于多行返回,SingleOrDefault将引发错误。有没有办法让EF来合并Parent? – ScubaSteve

+0

利用'.FirstOrDefault()'取而代之。 – ScubaSteve

相关问题