[英]EF6 + SQLite + Code First Out of Memory exception
我使用Entity framework 6
和SQLite
+ 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.