2016-09-25 6 views
1

を取得するときに、私はクラスのデータベースのレコード持っているすべてのエンティティをロードしません:ASPは、データベースレコード

public class Wallet 
{ 
    public Wallet() 
    { 
    } 

    public Wallet(string userName, CurrencySellPrices currencySellPrices, CurrencyAmounts currencyAmounts, double availableMoney) 
    { 
     UserName = userName; 
     CurrencySellPrices = currencySellPrices; 
     CurrencyAmounts = currencyAmounts; 
     AvailableMoney = availableMoney; 
    } 

    public int Id { get; set; } 
    public string UserName { get; set; } 
    public CurrencySellPrices CurrencySellPrices { get; set; } 
    public CurrencyAmounts CurrencyAmounts { get; set; } 
    public double AvailableMoney { get; set; } 

} 

を、私はこのコードでレコードを選択しようとすると:

public ActionResult Exchange() 
    { 
     var username = User.Identity.GetUserName(); 
     var model = _db.Wallets.ToList().Find(r=>r.UserName==username); 
     return View(model); 
    } 

これは正しいレコードを取得しますが、クラスCurrenciesSellPricesおよびCurrencyAmountsのオブジェクトはnullです。データベースでは、それらは適切なレコードです。

クラスは次のようになります。

{ 
    public int Id { get; set; } 
    public int UsdAmount { get; set; } 
    public int EurAmount { get; set; } 
    public int ChfAmount { get; set; } 
    public int RubAmount { get; set; } 
    public int CzkAmount { get; set; } 
    public int GbpAmount { get; set; } 
} 

public class CurrencySellPrices 
{ 
    public int Id { get; set; } 
    public double UsdSellPrice { get; set; } 
    public double EurSellPrice { get; set; } 
    public double ChfSellPrice { get; set; } 
    public double RubSellPrice { get; set; } 
    public double CzkSellPrice { get; set; } 
    public double GbpSellPrice { get; set; } 
} 

私は、彼らが適切にデータベースからロードされていないので、何かが私のクラスイム足りませんか?

答えて

0

EntityFrameworkは、明示的に通知されていなければ、関連するエンティティを自動的に読み込みません。

Eager Loadingで期待される結果が得られます。

var model = _db.Wallets 
       .Include(wallet => wallet.CurrencySellPrices) 
       .Include(wallet => wallet.CurrencyAmounts) 
       .Find(r => r.UserName == username) 
       .ToList(); 

私はまた、唯一選ばれたエンティティを抽出し、それらのすべてをロードし、次にあなたが必要とするものをフィルタリングしないために、とToListメソッドを探すの順序を切り替えました。あなたがそれらをロードするために、エンティティフレームワークを教えてください

+0

それは、ありがとうございました。あなたの回答@OrelErakiに感謝します! – VeryVicious

0

、それは遅延ロードと呼ばれるエンティティフレームワークの人気のある行動だ あなたのコードは、あなたがあなたのエンティティを含める必要があり、この

_db.Wallets.Include(w => w.CurrenciesSellPrices) 
      .Include(w => w.CurrencyAmounts) 
      .ToList().Find(r=>r.UserName==username); 
0

のようになります「それはグーグル」、これを試してみてください:

_db.Wallets 
    .Include(nameof(Wallets.CurrencySellPrices)) 
    .Include(nameof(Wallets.CurrencyAmounts)) 
    .Find(r=>r.UserName==username) 
    .ToList(); 

_db.Wallets 
    .Include(wallet => wallet.CurrencySellPrices) 
    .Include(wallet => wallet.CurrencyAmounts) 
    .Find(r=>r.UserName==username) 
    .ToList(); 

前者は、名前を介してプロパティを含めることによって行われ、後者は、LINQ式を介してプロパティを含めて行われます。両方とも同じ結果が得られます。

名前からわかるように、Includeには、Entity Framework経由でデータを取得する際の関係が含まれています。

関連する問題