我正在调试我公司软件中发生的奇怪问题。
多个请求(> 10 000)导致StackOverflow exception
左右的高内存使用量导致其他部分软件崩溃。
当我测试我们的代码时,我发现即使是非常简单的请求,例如Test
方法也会导致这种巨大的内存增益:
public void Test()
{
for(int i = 0; i < 1000000; i++)
{
using (var db = new FruitsDBEntity())
{
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
var any = db.Fruits.AsNoTracking().Any();
}
}
}
我没有使用带有导航属性的任何.Include(),但我想知道导航属性配置是否会导致该问题。
这是我的FruitsDBEntity
模型:
public partial class Fruit
{
[Key]
public long FruitId { get; set; }
public long TreeId { get; set; }
[ForeignKey("TreeId")]
public Tree Tree { get; set; } //Navigation property
public List<FruitMetaData> FruitMetaData { get; set; }
}
public partial class FruitMetaData
{
[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long FruitId { get; set; }
[Key]
[Column(Order = 1)]
public string MetaType { get; set; }
[Required]
public string Value { get; set; }
[JsonIgnore]
public Fruit Fruit { get; set; } // Navigation property
}
public partial class Tree
{
[Key]
[Column(Order = 0)]
public long TreeId { get; set; }
[Column(Order = 1)]
public string TreeName { get; set; }
public List<Fruit> TreeFruits { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<FruitsDBEntity>(null);
modelBuilder.Entity<Tree>()
.HasMany(e => e.TreeFruits)
.WithRequired(e => e.Tree)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Fruit>()
.HasMany(e => e.FruitMetaData)
.WithRequired(e => e.Fruit)
.WillCascadeOnDelete(false);
}
我将不胜感激任何帮助。
[编辑] 我的配置: .NET版本: 4.5但我也在4.5.2上测试了相同的结果 实体框架版本: 6.1.3 SQL Server版本:在SQL Server 2016 Express和SQL Server 2016 Developer上测试。两者都在同一台机器上。 经过测试: a)2C / 4T + 8GB RAM b)4C / 8T + 16GB RAM 两个Windows 10
完整异常消息:
System.StackOverflowException was unhandled
Message: An unhandled exception of type 'System.StackOverflowException' occurred in EntityFramework.SqlServer.dll