web-dev-qa-db-ja.com

EFナビゲーションプロパティがnullを返すのはなぜですか?

私は2つのモデルを持っています1)

public class Indicator
{
    public long ID { get; set; }
    public string Name { get; set; }
    public int MaxPoint { get; set; }
    public string Comment { get; set; }
    public DateTime DateChanged { get; set; }
    public DateTime DateCreated { get; set; }

    public virtual IList<CalculationType> CalculationTypes { get; set; }
    public virtual IList<TestEntity> TestEntitys { get; set; }
    public virtual IndicatorGroup IndicatorGroup { get; set; }
}

2)

public class CalculationType
{
    public long ID { get; set; }
    public string UnitName { get; set; }
    public int Point { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateChanged { get; set; }

    public virtual Indicator Indicator { get; set; }
    public virtual IList<Сalculation> Calculations { get; set; }
}

このコードを実行します

var indicator = DataContext.Indicators.FirstOrDefault(i => i.ID == indicatorID);
var test = DataContext.CalculationTypes.FirstOrDefault();

ナビゲーションプロパティCalculationTypesで最初の行がnullを返す enter image description here

2行目は空のコレクションを返します。enter image description here どうして?

[〜#〜] update [〜#〜]スナップショットデータベース enter image description hereenter image description here プロジェクトリンク https://github.com/wkololo4ever/Stankin

計算を追加

    public class Сalculation
{
    public long ID { get; set; }

    public virtual CalculationType CalculationType { get; set; }
    public virtual ApplicationUser Creator { get; set; }
}
12
kriper

1)遅延読み込みは有効になっていますか?そうでない場合は、「。Include」構文を使用してナビゲーションプロパティを明示的にロードする必要があります。

2)EFがその関係を検出できるはずですか?コードファーストまたはデータベースファーストを使用しましたか?

編集:3)データベースにデータがあり、IndicatorからIndicatorGroupへの外部キーにその特定のレコードの値があることを確認しますか?これは、単にデータがない場合に値「null」が有効であるためです。

P.S. 「IndicatorGroupId」というIndicatorに外部キーが表示されない場合は、「IndicatorGroup」テーブルに「IndicatorId」がある可能性があります。その場合、指定した名前から、データベースが正しく構成されていないため、を使用する必要があります。外部キーの作成方法をEFに指示するための流暢な構文またはデータ属性。

4
Moeri

これを試して:

DbContext.Configuration.ProxyCreationEnabled = true;    
DbContext.Configuration.LazyLoadingEnabled = true;  

DbContext.Configuration.ProxyCreationEnabledがfalseに設定されている場合、親オブジェクトでIncludeメソッドが呼び出されない限り、DbContextは一部の親オブジェクトの子オブジェクトをロードしません。 DbContext.Configuration.LazyLoadingEnabledをtrueまたはfalseに設定しても、その動作には影響しません。

DbContext.Configuration.ProxyCreationEnabledがtrueに設定されている場合、子オブジェクトは自動的にロードされ、DbContext.Configuration.LazyLoadingEnabled値は子オブジェクトがいつロードされるかを制御します。

私はこれが問題だと思います:

編集:3)データベースにデータがあり、IndicatorからIndicatorGroupへの外部キーにその特定のレコードの値があることを確認しますか?これは、単にデータがない場合に値「null」が有効であるためです。

P.S. 「IndicatorGroupId」というIndicatorに外部キーが表示されない場合は、「IndicatorGroup」テーブルに「IndicatorId」がある可能性があります。その場合、指定した名前から、データベースが正しく構成されていないため、を使用する必要があります。外部キーの作成方法をEFに指示するための流暢な構文またはデータ属性。

これを試して、外部キーが修正されていることを確認してください。

public class CalculationType
{
    public long ID { get; set; }
    public string UnitName { get; set; }
    public int Point { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateChanged { get; set; }
    [ForeignKey("IndicatorID")]
    public string IndicatorId { get; set; } //this is the foreign key, i saw in your database is: Indicator_ID, avoid this, rename it to IndicatorID or IndicatorId

    public virtual Indicator Indicator { get; set; }
    public virtual IList<Сalculation> Calculations { get; set; }
}
3
toannm

動作は同じですが、選択した回答とは根本原因が異なります。

myContext.Configuration.AutoDetectChangesEnabledをオフにした場合、ナビゲーションプロパティもnullになる可能性があります

非常に明白ですが、これは私がいくつかのパフォーマンスの改善を実装していたときに私に得ました。

3
GraehamF

これをチェックしてください: コードファーストのナビゲーションプロパティ 。ナビゲーションプロパティがnullである理由とその解決策について説明します。

デフォルトでは、ナビゲーションプロパティはnullであり、デフォルトではロードされません。ナビゲーションプロパティの読み込みには、IQuearableの「include」メソッドを使用します。このタイプの読み込みはEagerloadingと呼ばれます。

積極的な読み込み:1つのタイプのエンティティのクエリが、関連するエンティティをクエリの一部として読み込むプロセスであり、IQueryableの「include」メソッドによって実現されます。

2
Kenny Eng