【发布时间】: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<Transfer>(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