簡體   English   中英

實體框架6代碼優先的存儲過程映射到復雜對象

[英]Entity Framework 6 code-first stored procedure map to complex objects

如何使用存儲過程來獲取父代及其子代?

我的代碼的通用版本是這樣的:

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集合為null。 我需要怎么做才能填充這個?

如果您使用context.Database.SqlQuery則實體不會被跟蹤,只是作為純數據模型返回。 如果要解析子級(通過延遲加載),則需要以將對象添加到EF對象圖中的方式查詢它們:

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

通過對DbSet運行sql查詢,默認情況下它將跟蹤它們,並且延遲加載現在應該可以工作了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM