簡體   English   中英

EF6 + SQLite + 代碼優先內存不足異常

[英]EF6 + SQLite + Code First Out of Memory exception

我使用Entity framework 6SQLite + Code First並且在以下代碼Out of Memory exception ,盡管我正在釋放所有內存。

如果我取消注釋下一行不會顯示任何錯誤。

System.Windows.Forms.MessageBox.Show("");

有沒有人對此有解釋? COM 與 SQLITE 的通信是否依賴於 Wimdows 消息?

using SQLite.CodeFirst;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Threading;
using System.Windows;

namespace SQLiteDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Node> list = new List<Node>();
            for (int i = 0; i < 700000; ++i)
            {
                list.Add(new Node() { Id = i, Name = i.ToString() });
            }
            AddListToTree(list);
        }

        private void AddListToTree(List<Node> list)
        {
            TreeDbContext db = new TreeDbContext();
            db.Tree.Load();

            var transaction = db.Database.BeginTransaction();
            int Counter = 0;

            foreach (var node in list)
            {
                Counter += 1;
                if (Counter % 100000 == 0)
                {
                    // the magic here 
                    System.Windows.Forms.MessageBox.Show("");
                }
                db.Database.ExecuteSqlCommand(
                    "INSERT INTO [Nodes]([Name], [Order], [Type], [Parent_Id]) VALUES (@p0, @p1, @p2, @p3);",
                    node.Name, node.Order,
                    node.Type,
                    node.Parent == null ? (object)DBNull.Value : node.Parent.Id);
            }
            transaction.Commit();
            transaction.Dispose();
            db.Dispose();
        }
    }

    class Node
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Node Parent { get; set; }
        public int Order { get; set; }
        public byte Type { get; set; }
    }

    class TreeDbContext : DbContext
    {
        public TreeDbContext()
            : base("MyDbContextDB")
        { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<TreeDbContext>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }

        public DbSet<Node> Tree { get; set; }
    }
}

我最近遇到了類似的例外,谷歌搜索讓我想到了這個問題。

對於由於谷歌而最終出現在此頁面上的任何人,我想我會提供我的解決方案。

所以我試圖將一個原始 sql 查詢映射到一個對象並得到一個“內存不足異常”,我不明白,因為我有 3 個實體要映射......

事實證明,當您將原始 sql 結果映射到具有以下內容的對象時:

context.Database.SqlQuery<MyObject>($"SQL QUERY").ToList()

MyObject的屬性與查詢結果相同(不多不少)。 如果不這樣做,將干擾 SQLite3 驅動程序的內部映射,導致它向語句處理程序請求一個索引為-1的列,驅動程序會將其視為會觸發 OOME 的錯誤內存分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM