3

私の ASP.NET MVC 4 アプリケーションは Entity Framework v5、Ninject および Ninject.MVC3 nuget パッケージを使用しており、データは SQL Server Express に格納されています。モデルは、「EF 5.x DbContext Generator for C#」テンプレートを使用して生成されました。私のedmxでは、Lazy Loading EnabledがTrueに設定されています。

私はリポジトリ パターンを使用しています。リポジトリとコンテキストは、ASP.NET MVC 4 プロジェクトによって参照されるソリューション内の別のプロジェクトに存在します。

問題は、ビュー モデルのプロパティである新しいオブジェクト ("Trade") を保存した後、そのオブジェクトのリポジトリをクエリすることです。その時点で、入力されると予想されるナビゲーション プロパティは null です。以下の Create() メソッドのコメントを参照してください。

データベースから既存の Trade (保存しただけではないもの) を取得すると、すべてのナビゲーション プロパティが入力されているように見えます。

このページで、類似/同一の問題のレポートを見つけました。記事の著者は、「これは DbContext の不具合だと思います。つまり、外部キー ナビゲーション プロパティの遅延読み込みは、新しく追加された項目では機能しませんが、ナビゲーション プロパティの遅延読み込みは多くの端で機能します」と述べています。細かい, など Teacher.Classes. このグリッチは、新しく追加されたアイテムに対してのみ発生します. 新しく追加されたアイテムに対して上記で明示的に Class.Teacher をロードしない場合, Entity Framework のどこかにロードされていない場合は null になります.ただし、既にどこかに読み込まれている場合、C.Teacher は Entity Framework によって自動的に解決されます。一方、ObjectContext の場合、すべての種類のナビゲーション プロパティで遅延読み込みが問題ありません。

私のコントローラーの Create メソッドは次のようになります。

[HttpPost]
public ActionResult Create(TradeViewModel tradeViewModel)
{
    if (ModelState.IsValid)
    {
        _employeesRepository.SaveTrade(tradeViewModel.Trade);
        var trade =
            _employeesRepository.Trades.First(
                x =>
                x.RequesterId == tradeViewModel.Trade.RequesterId &&
                x.RequesterWorkDate == tradeViewModel.Trade.RequesterWorkDate);

        // Null reference encountered below, as trade.TradeType and trade.Employee are both null
        String userMessage = "New " + trade.TradeType.TradeTypeDescription + " requested with '" + ControllerHelpers.GetDisplayName(trade.Employee) + "'";
        TempData["UserMessage"] = userMessage;

        return RedirectToAction("Index");
    }
    return View();
}

従業員リポジトリの SaveTrade() メソッドは次のようになります。

public void SaveTrade(Trade trade)
{
    var data = (from t in _context.Trades
                where t.RequesterId == trade.RequesterId
                      && t.RequesterWorkDate == trade.RequesterWorkDate
                select t);
    if (!data.Any())
    {
        _context.Trades.Add(trade);
    }
    _context.SaveChanges();
}

最後に、_employeesRepository の Trades は次のようになります。

public IQueryable<Trade> Trades
{
    get { return _context.Trades; }
}
4

2 に答える 2

2
于 2012-12-01T02:33:38.240 に答える