我使用Entity framework 6
和SQLite
+ 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; }
}
}
答案 0 :(得分:0)
我最近遇到了类似的异常,并且使用谷歌搜索使我陷入了这个问题。
对于那些由于google而最终进入该页面的人,我想我会提供我的解决方案。
所以我试图将原始sql查询映射到一个对象,并得到了“内存不足异常”,这是我不理解的,因为我有3个实体要映射...
事实证明,当您将原始sql结果映射到具有以下内容的对象时:
context.Database.SqlQuery<MyObject>($"SQL QUERY").ToList()
MyObject
的属性应与查询的结果相同(不能少)。否则,SQLite3驱动程序的内部映射会混乱,导致其向语句处理程序请求索引为-1
的列,驱动程序将其视为错误的内存分配,这将触发OOME。