Entity Framework多个简单的请求导致StackOverflowExceptions

时间:2017-02-06 10:15:23

标签: c# entity-framework

我正在调试我公司软件中发生的奇怪问题。

多个请求(> 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

0 个答案:

没有答案