代码之家  ›  专栏  ›  技术社区  ›  monstertjie_za

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

  •  0
  • monstertjie_za  · 技术社区  · 6 年前

    我有以下问题:

    假设我有以下对象:

    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 类,如下所示:

    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 ,是因为,每个类、每个集合中都包含完整的 换乘 在每个子级的导航属性中初始化 换乘 对象,也再次包含所有集合属性的完整集。在我看来,这会导致SQL无限地为每个传输及其集合生成SQL。

    2 回复  |  直到 6 年前
        1
  •  1
  •   AlleXyS    6 年前

    我认为你需要在你的上下文定义中具体说明如下:

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