在SqLite文件数据库上使用此代码时,它可以正常工作。
using (var ctx = new Test2010Entities())
{
string s = "CREATE TABLE 'Company' ([Id] integer PRIMARY KEY AUTOINCREMENT NOT NULL, varchar(50) NOT NULL);";
ctx.ExecuteStoreCommand(s);
ctx.Companies.AddObject(new Company { Code = "_1" });
ctx.Companies.AddObject(new Company { Code = "_2" });
ctx.SaveChanges();
foreach (var c in ctx.Companies.ToList())
{
Console.WriteLine(c.Code);
}
}
但是当在SqLite“内存”数据库中运行此代码时(数据源=:内存:;版本= 3;新=真; ),我得到此异常:
未处理的异常:System.Data.UpdateException:发生错误 在更新条目时。有关详细信息,请参阅内部异常---> System.Data.SQLite.SQLiteException:SQL逻辑错误或丢失 数据库没有这样的表:公司
请注意,这是使用VS 2010,EF 4.4.0.0和sqlite-netFx40-setup-bundle-x86-2010-1.0.84.0测试的
::: UPDATE :::
正如Simon Svensson建议的那样,在任何其他命令之前打开连接确实可以解决问题:
ctx.Connection.Open();
答案 0 :(得分:5)
当您的ORM关闭连接并重新打开它时,会发生这种情况。这会将sqlite内存数据库重置为默认状态;即空。
除非你设置connection.release_mode = close
(默认为after_transaction
,否则NHibernate会发生同样的事情。
我不熟悉Entity Framework,但我希望有类似的设置或使用DataContext(IDbConnection)
构造函数,该构造函数记录为“如果提供开放连接,DataContext将不会关闭它。”
相同的文档还指出“在System.Transactions事务中,DataContext不会打开或关闭连接以避免升级。”这可能是一个更清洁的解决方案。
使用一些Reflector魔术表明它是SQLiteConnection.Open,它调用(通过SQLite3.Open)sqlite3_open_interop(如果你使用的是NuGet sqlite包)。这表明每次调用SQLiteConnection.Open时都会获得一个新的空内存数据库。