我有问题EF 5和延迟加载循环引用。实体框架5循环延迟加载原因OutOfMemoryException
下图代表我的模型。
主要问题是Model和ModelProperties类之间,因为Model包含IEnumerable导航属性,而ModelProperty包含Model导航属性。
所以这样的设计会导致以下
的情况,您可以访问全尺寸图像http://tinypic.com/r/2vskuxl/6
你可以想象这会引起非常大的问题,内存溢出的例外。
只有我能找到的解决方案是禁用延迟加载和使用其他方法。但延迟加载非常简化我们的工作。 我希望有一个配置或一个属性来帮助我加载只有两个级别的关系与延迟加载。
有什么办法可以达到这个目的吗?
更新: 关于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也可能导致此。由于实体框架配置文件告诉成千上万在运行时调用的Autommaper方法。
UPDATE 4: 这里是EFProf堆栈跟踪: 您访问更大的版本http://tinypic.com/r/21cazv4/6
UPDATE 5 您可以在这里看到示例项目:https://github.com/bahadirarslan/AutomapperCircularReference 在样品中,你可以看到轻松不已通过Quick Watch循环。
Bahadir,我猜你是先使用代码,所以没有EDMX看。您可以使用EF Power Tool来生成模型的可视化表示并在此共享它吗?如果你不知道如何使用这个工具,我会在这个视频的大约19:00演示它:http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Entity-Framework-Tips-and-技巧#时间= 19m00s – 2013-03-17 00:32:27
你可以显示一段导致“OutOfMemoryException”的代码吗?在快速查看中,您可以永久钻取,但您可以自行触发延迟加载。应用程序中的哪些代码或进程会导致问题? – 2013-03-17 08:56:48
@JulieLerman我加了EF的视觉模型。我希望这有帮助。 – 2013-03-17 09:49:46