0

既存のデータベースへのコード ファースト アプローチを使用しています。私たちのアプリケーションでは、ORM は EF6 であり、PRISM 5.0 も使用しています。RequestNavigate メソッドを使用してオブジェクトをパラメーターとして他のビュー モデルに渡すと、問題が発生します。

私たちの目的:

[Table("Pracownicy")]
public partial class Pracownicy
{
  ///...
  public string Name {get; set;}

  public virtual ICollection<KartyRCP> KartyRCP { get; set; }

  ///...
}

[Table("KartyRCP")]
public partial class KartyRCP
{
  ///...
  public string Numer {get; set;}

  ///...
}

渡された OnNavigatedTo メソッドで Pracownicy のオブジェクトを受け取ります。

public void OnNavigatedTo(NavigationContext navigationContext)
{
    if (Worker == null && navigationContext.Parameters["pracownik"] != null)
    {
       Worker = (Pracownicy)navigationContext.Parameters["pracownik"];

       if (Worker != null)
       {
           WorkerPhoto = Worker.Photo;
                UpdateWorkAbsencesList();                                                                          
       }
    }   
}

この ViewModel では、関連する KartyRCP エンティティ (KartyRCP (Worker.KartyRCP) との 1 対多の関係) を照会する Pracownicy POCO [NotMapped] プロパティを参照します。

[NotMapped]
public string AktualnaKartaRCP
{
   get
    {
        if (aktualnaKartaRCP == null)
        {                    
            aktualnaKartaRCP = this.KartyRCP.Where(z => z.OkresFrom <= DateTime.Today && z.OkresTo >= DateTime.Today).Select(x => x.Numer).FirstOrDefault();
            if(aktualnaKartaRCP != null)
              aktualnaKartaRCP = aktualnaKartaRCP.TrimStart('0');                    
        }
        return aktualnaKartaRCP;
    }
 }

Pracownicy の最初のインスタンスを表示すると、結果は予想どおりです。KartyRCP の 1 つが選択されています。しかし、Pracownicy の別のインスタンスを表示しようとすると、AktualnaKartaRCP プロパティは null を返します。これは、データベースに存在するにもかかわらず、KartyRCP にデータが入力されておらず、アイテムが含まれていないためです。同じインスタンス Pracownicy を再度開こうとすると、KartyRCP が読み込まれるのはさらに奇妙です。

POCO クラス内からクエリを実行するときに、遅延読み込みが関連するエンティティに入力されない理由はわかりません。

最初に、KartyRCP にデータを入力するビュー モデルからリストを要求するという 2 つの回避策を見つけましたvar WorkAroundGetList = Worker.KartyRCP;。他の回避策は、include ステートメントを使用して、Pracownicy で熱心にロードされるテーブルをインクルードすることです。.Include(z => z.KartyRCP)

しかし、私たちはそのような解決策に満足していません。事前に助けてくれてありがとう。

4

1 に答える 1

0

データベースのコンテキスト コンストラクターでは、デフォルトで無効になっているため、遅延読み込みを有効にする必要があります。

    public MyDbContext()
        : base("MyDbContext")
    {
        this.Configuration.LazyLoadingEnabled = true;
    }
于 2015-01-09T14:15:20.700 に答える