循環参照を使用した 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 サンプルでは、クイック ウォッチを介して簡単に無限ループを確認できます。