2

循環参照を使用した EF 5 と遅延読み込みに問題があります。

下の写真は私のモデルを表しています。 ここに画像の説明を入力

Model には IEnumerable ナビゲーション プロパティが含まれ、ModelProperty には Model ナビゲーション プロパティが含まれるため、主な問題は Model クラスと ModelProperties クラスの間にあります。

したがって、この設計は以下の状況を引き起こします ここに画像の説明を入力

フルサイズの画像にアクセスできますhttp://tinypic.com/r/2vskuxl/6

ご想像のとおり、これにより OutOfMemory 例外という非常に大きな問題が発生します。

私が見つけた唯一の解決策は、遅延読み込みを無効にし、他の方法を使用することです。しかし、遅延読み込みは作業を非常に単純化します。遅延読み込みを使用して 2 レベルのリレーションのみを読み込むのに役立つ構成または属性があることを願っています。

これを達成する方法はありますか?

更新: Julie Lerman からのリクエストに関して、EF のビジュアル モデルを次に示します。問題を引き起こす主な関係を強調しました。 また、 http://tinypic.com/r/30v15pg/6ここに画像の説明を入力 でフルサイズにアクセスできます。

更新 2: モデル定義は次のとおりです。

public class Model {
        public int ModelID { get; set; }
        public int BrandID {
            get;
            set;
        }
        public virtual Brand Brand { get; set; }
        public string Logo { get; set; }
        public string Name { get; set; }
        public virtual ICollection<ModelProperty> ModelProperties {
            get;
            set;
        }
}

public class ModelProperty {

    public int ModelPropertyID {
        get;
        set;
    }

    public virtual int PropertyDefinitionID {
        get;
        set;
    }

    public virtual PropertyDefinition PropertyDefinition {
        get;
        set;
    }

    public virtual int ModelID {
        get;
        set;
    }

    public virtual Model Model {
        get;
        set;
    }

    public bool IsContainable {
        get;
        set;
    }

    public bool HasFilterDefinition {
        get;
        set;
    }

    public virtual ICollection<ModelPropertyValue> ModelPropertyValues {
        get;
        set;
    }

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

また、ModelProperty のエンティティ構成もあります。

 public class ModelPropertyEntityTypeConfiguration : EntityTypeConfiguration<ModelProperty> {
        public ModelPropertyEntityTypeConfiguration() {
            HasKey(p => p.ModelPropertyID);

            HasRequired(p => p.PropertyDefinition).WithMany(s => s.ModelProperties).HasForeignKey(s => s.PropertyDefinitionID).WillCascadeOnDelete(false);
            HasRequired(p => p.Model).WithMany(s => s.ModelProperties).HasForeignKey(s => s.ModelID).WillCascadeOnDelete(false);
            HasMany(p => p.ModelPropertyValues).WithRequired(s => s.ModelProperty).HasForeignKey(s => s.ModelPropertyID).WillCascadeOnDelete(true); 
            HasMany(p => p.ModelPropertyMatchingFilter).WithRequired(s => s.ContainerModelProperty).HasForeignKey(s => s.ContainerModelPropertyID).WillCascadeOnDelete(false);
            ToTable("dbo.ModelProperties");
        }
    }

更新 3: よくわかりませんが、Automapper もこれを引き起こす可能性があります。Entity Framework Profile は、実行中に呼び出される何千もの Autommaper メソッドを通知するためです。

更新 4: これが EFProf スタックトレースです: ここに画像の説明を入力 より大きなバージョンにアクセスしますhttp://tinypic.com/r/21cazv4/6

UPDATE 5 ここでサンプル プロジェクトを確認できます: https://github.com/bahadirarslan/AutomapperCircularReference サンプルでは、​​クイック ウォッチを介して簡単に無限ループを確認できます。

4

2 に答える 2

1

プロキシオブジェクトをバイパスするために遅延読み込みを無効にするか、必要なものをDTOとして返す必要があります。ドメインの詳細を非表示にするため、DTOを使用することをお勧めします

于 2013-03-18T13:15:03.280 に答える
1

更新していただきありがとうございます。モデルさん、元気そうです。これは単なる 1:* の関係であることを確実に認識しています。ラディスラフ(いつものように)は正しいです。LL は問題を引き起こしません...シリアル化中の 1 つの場所を除いて。コードがサービスに含まれる可能性はありますか? 通常の遅延読み込みでは、明示的に言及したプロパティのみが遅延読み込みされます。ただし、シリアル化中、シリアル化はすべてのプロパティを「言及」するため、グラフ全体でプロパティのロードとロードを続けるだけで、循環依存の問題が発生します。サービスでは、データを返す前に (context.configuration.lazyloadingenabled=false を使用して) 遅延読み込みをオフにする必要があります。そのため、サービス メソッドでは、グラフを取得するために熱心な読み込み、遅延読み込み、または明示的な読み込みを行うことができますが、結果を返す前に遅延読み込みを無効にします。

于 2013-03-17T13:28:54.277 に答える