2017-03-07 42 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

相關問題