如何使用存储过程获取父级及其子级?
我的代码的通用版本是:
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
集合为空。我需要做些什么来填充这个?
答案 0 :(得分:1)
如果使用context.Database.SqlQuery
实体未跟踪,则只返回纯数据模型。如果你想解决孩子(通过延迟加载),那么你需要以一种方式查询它们,同时将对象添加到EF对象图中:
_context.Set<Parent>().SqlQuery(...)
通过对DbSet
运行sql查询,它将默认跟踪它们,延迟加载现在可以正常工作。