2015年10月18日

EntityFramework(10):関連エンティティの明示的読み込み (Explicitly Loading)

  
Explicitly Loadingはあまり使わないと思うけど、いちおう書いておきます。

遅延読み込みをせずに、自分ですべて関連エンティティの読み込みを制御したい時に利用します。

using (var db = new NorthwindContext()) { db.Database.Log = sql => { Console.Write(sql); }; db.Configuration.LazyLoadingEnabled = false; // ★ var query = from ord in db.Orders where ord.ShipVia == 3 select ord; var order = query.First(); Console.WriteLine(order.Customer.CompanyName); }

★の行で、関連エンティティの遅延読み込みをオフにしているので、 最後の、order.Customer.CompanyName の参照で、NullReferenceException が発生します。

次が、明示的読み込みで、Customer を読み込む例です。

 using (var db = new NorthwindContext()) {
     db.Database.Log = sql => { Console.Write(sql); };
     db.Configuration.LazyLoadingEnabled = false;
     var query = from ord in db.Orders
                 where ord.ShipVia == 3
                 select ord;
     var order = query.First();
     db.Entry(order).Reference(o => o.Customer).Load();
     Console.WriteLine(order.Customer.CompanyName);
 }

Reference メソッドで、読み込みたいエンティティを指定し、続けてLoadメソッド呼び出します。
以下のSQLが発行されます。

SELECT
    [Extent1].[CustomerID] AS [CustomerID],
    [Extent1].[CompanyName] AS [CompanyName],
    [Extent1].[ContactName] AS [ContactName],
    [Extent1].[ContactTitle] AS [ContactTitle],
    [Extent1].[Address] AS [Address],
    [Extent1].[City] AS [City],
    [Extent1].[Region] AS [Region],
    [Extent1].[PostalCode] AS [PostalCode],
    [Extent1].[Country] AS [Country],
    [Extent1].[Phone] AS [Phone],
    [Extent1].[Fax] AS [Fax]
    FROM [dbo].[Customers] AS [Extent1]
    WHERE [Extent1].[CustomerID] = @EntityKeyValue1


関連エンティティが、コレクションの場合は、Referenceメソッドの代わりに、 Collection メソッドを使います。

db.Entry(order).Collection(o => o.Order_Details).Load();

以下発行されるSQLです。

SELECT
  [Extent1].[OrderID] AS [OrderID],
  [Extent1].[ProductID] AS [ProductID],
  [Extent1].[UnitPrice] AS [UnitPrice],
  [Extent1].[Quantity] AS [Quantity],
  [Extent1].[Discount] AS [Discount]
  FROM [dbo].[Order Details] AS [Extent1]
  WHERE [Extent1].[OrderID] = @EntityKeyValue1


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52437374