2017-03-07 5 views
0

ストアドプロシージャを使用して親子を取得するにはどうすればよいですか?Entity Framework 6コードファーストストアドプロシージャが複雑なオブジェクトにマップ

私のコードのジェネリックバージョンはこれです:

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

ストアドプロシージャがselect単純です:私は、ストアドプロシージャを呼び出すと、同様の両親の子供を取得しようとしています

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); 
    } 
} 

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

現在のところ、親データをオブジェクトにマッピングするだけです。 Childrenコレクションはnullです。これを埋めるためには何をする必要がありますか?

答えて

1

context.Database.SqlQueryを使用すると、エンティティは追跡されず、純粋なデータモデルとして返されます。あなたは(遅延ロードを経由して)子供を解決したいなら、あなたはまた、EFのオブジェクトグラフにオブジェクトを追加する方法でそれらを照会する必要があります。

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

DbSetに対してSQLクエリを実行することにより、それが追跡しますそれらはデフォルトで設定され、遅延ロードが機能するはずです。

+0

正確に私が望むように動作します。ありがとう! – ScubaSteve

+0

私は、複数の子供がいる場合、sprocが複数の行を返す問題にぶつかりました。したがって、コードでは、私は通常docontroll.Set ().SqlQuery()。SingleOrDefault(); '複数の行が返されるため、SingleOrDefaultはエラーをスローします。 EFに親を合体させる方法はありますか? – ScubaSteve

+0

代わりに '.FirstOrDefault()'を使用してトリックを行いました。 – ScubaSteve

関連する問題