C# EF核心插入导致内存不足问题

C# EF核心插入导致内存不足问题,c#,.net,entity-framework,asp.net-core,ef-core-3.0,C#,.net,Entity Framework,Asp.net Core,Ef Core 3.0,我有以下问题: 假设我有以下对象: 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;} pu

我有以下问题:

假设我有以下对象:

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;}
}
当我调用
context.Create(myEntity)
时,我可以看到传输类也填充了所有的子项(集合)

我认为插入导致
内存不足错误的原因是,每个集合中的每个类在每个子对象的导航属性中都包含完整的
传输
类,而这些
传输
对象中的每个对象也都包含一整套所有集合属性。在我看来,这导致SQL无限地为每次传输及其集合生成SQL


如何避免这种情况?

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

 modelBuilder.Entity<Transfer>()
        .HasMany(e => e.TransferScans)
        .WithOne(e => e.Transfer)
        .HasForeignKey(e => e.TransferId)
        .OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity()
.HasMany(e=>e.TransferScans)
.带一(e=>e.Transfer)
.HasForeignKey(e=>e.TransferId)
.OnDelete(DeleteBehavior.Cascade);
因为在您的示例中,一个传输包含多个项目,其中每个项目都包含一个传输,而此传输又包含一个项目列表,等等

如果您说您已经有了此配置,请在创建新ScaItem时尝试忽略TransferId:

TransferScans = new List<ScanItem>()
{
    new ScanItem() { ScanItemId = 0 }
}
TransferScans=新列表()
{
新建ScanItem(){ScanItemId=0}
}

Ca您能看到生成的查询吗?什么是
context.Create
?这不是一个标准的
DbContext
方法。@GertArnold只是一个包装函数:public virtual void Create(TEntity entity),其中TEntity:class{Context.Set().Add(entity);}你应该在你的问题中添加这种信息,这是人们首先想知道的。在你显示的代码中没有明显的错误。这似乎不是真正的代码。(“假设我有……”)不管怎样,我想出来了。当我试图运行EF Core生成的原始SQL时,SQL给了我一个无法将varchar值转换为datetime的错误。结果是,我试图将空值插入到不可为空的datetime字段中。.Net中模型的属性可为Null datetime,但SQL中的列不可为Null。不确定为什么我没有从SQLMy mappings设置正确返回正确消息尝试忽略,TransferId(更新的答案)TransferId是一个int,因此无论我是否设置它,它都将始终为0,因为它不是一个可为null的整数
TransferScans = new List<ScanItem>()
{
    new ScanItem() { ScanItemId = 0 }
}