我对 EF 5 和循环引用的延迟加载有疑问。
下图代表我的模型。
主要问题在于 Model 和 ModelProperties 类之间,因为 Model 包含 IEnumerable 导航属性,而 ModelProperty 包含 Model 导航属性。
所以这个设计导致下面的情况
您可以访问全尺寸图片http://tinypic.com/r/2vskuxl/6
正如您可以想象的那样,这会导致非常大的问题,OutOfMemory 异常。
我能找到的唯一解决方案是禁用延迟加载并使用其他方法。但是延迟加载非常简化我们的工作。我希望有一个配置或一个属性来帮助我加载只有两个级别的关系和延迟加载。
有什么办法可以做到这一点?
更新: 关于 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
更新 5 您可以在此处查看示例项目:https ://github.com/bahadirarslan/AutomapperCircularReference 在示例中,您可以通过快速观看轻松查看无限循环。