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 }
}