EF6 + SQLite + Code First Out of Memory异常

时间:2017-05-25 17:11:37

标签: c# entity-framework sqlite code-first

我使用Entity framework 6SQLite + Code First 我在下面的代码中得到Out of Memory exception,但我释放了所有的记忆。

如果我取消注释下一行没有显示任何错误。

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

有没有人对此有解释? 与SQLITE的COM通信是否依赖于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; }
    }
}

1 个答案:

答案 0 :(得分:0)

我最近遇到了类似的异常,并且使用谷歌搜索使我陷入了这个问题。

对于那些由于google而最终进入该页面的人,我想我会提供我的解决方案。

所以我试图将原始sql查询映射到一个对象,并得到了“内存不足异常”,这是我不理解的,因为我有3个实体要映射...

事实证明,当您将原始sql结果映射到具有以下内容的对象时:

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

MyObject的属性应与查询的结果相同(不能少)。否则,SQLite3驱动程序的内部映射会混乱,导致其向语句处理程序请求索引为-1的列,驱动程序将其视为错误的内存分配,这将触发OOME。