实体框架6代码优先存储过程映射到复杂对象

时间:2017-03-07 14:06:23

标签: c# stored-procedures ef-code-first entity-framework-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 个答案:

答案 0 :(得分:1)

如果使用context.Database.SqlQuery实体未跟踪,则只返回纯数据模型。如果你想解决孩子(通过延迟加载),那么你需要以一种方式查询它们,同时将对象添加到EF对象图中:

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

通过对DbSet运行sql查询,它将默认跟踪它们,延迟加载现在可以正常工作。