【问题标题】:EF Core INSERT causes out of memory issue [closed]EF Core INSERT 导致内存不足问题 [关闭]
【发布时间】:2026-01-08 11:50:01
【问题描述】:

我有以下问题:

假设我有以下对象:

public class Transfer
{
    public int TransferId {get; set;}
    public ICollection<ScanItem> TransferScans {get; set;}
}
public class ScanItem
{
    public int ScanItemId {get; set;}
    public TransferId {get; set;}

    public Transfer Transfer {get; set;}
}

这是我的实际 Transfer 类的简单表示,因为 Transfer 类上有大约 11 个集合

我初始化Transfer类,如下:

var transfer = new Transfer() 
{
    TransferId = 0,
    TransferScans = new List<ScanItem>()
    {
        new ScanItem() { ScanItemId = 0, TransferId = 0 }
    }
};

当我调用context.Create&lt;Transfer&gt;(myEntity) 时,我可以看到Transfer 类也填充了所有子项(集合)。

我相信插入导致Out Of Memory error 的原因是,每个集合中的每个类都包含每个子项的导航属性中的完整Transfer 类,以及每个Transfer 对象, 还包含了所有集合属性的完整集合。在我看来,这会导致 SQL 无限地为每个 Transfer 及其集合生成 SQL。

我怎样才能避免这种情况?

【问题讨论】:

  • 您看到生成的查询了吗?
  • 什么是context.Create?这不是标准的DbContext 方法。
  • @GertArnold 只是一个包装函数: public virtual void Create(TEntity entity) where TEntity : class { Context.Set().Add(entity); }
  • 您应该在您的问题中添加此类信息,这是人们首先会想知道的。在您显示的代码中,没有任何明显错误。它似乎不是真正的代码。 (“假设我有……”)
  • 无论如何,想通了。当我尝试运行由 EF Core 生成的原始 SQL 时,SQL 给了我一个错误,即无法将 varchar 值转换为日期时间。原来,我试图将空值插入到不可为空的日期时间字段中。 .Net 中模型上的属性是可为空的日期时间,但 SQL 中的列不可为空。不知道为什么我没有从 SQL 得到正确的消息

标签: c# .net entity-framework asp.net-core ef-core-3.0


【解决方案1】:

我认为您需要在上下文定义中指定为:

 modelBuilder.Entity<Transfer>()
        .HasMany(e => e.TransferScans)
        .WithOne(e => e.Transfer)
        .HasForeignKey(e => e.TransferId)
        .OnDelete(DeleteBehavior.Cascade);

因为在您的示例中,一个转移包含许多项目,其中每个项目包含一个转移,此转移又包含一个项目列表等,等等

如果你说你已经有了这个配置,那就在创建新的 ScaItem 时尝试忽略 TransferId:

TransferScans = new List<ScanItem>()
{
    new ScanItem() { ScanItemId = 0 }
}

【讨论】:

  • 我的映射设置正确
  • 尽量忽略,TransferId(更新答案)
  • TransferId 是一个int,所以不管我设置与否,它总是0,因为它不是一个可以为空的整数