C# SqLite内存数据库:创建表不工作?
在SqLite文件数据库上使用此代码时,效果良好C# SqLite内存数据库:创建表不工作?,c#,sql,entity-framework,sqlite,C#,Sql,Entity Framework,Sqlite,在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 Co
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逻辑错误或缺失 数据库没有这样的表:Company 注意:这是用VS 2010、EF 4.4.0.0和sqlite-netFx40-setup-bundle-x86-2010-1.0.84.0测试的
::更新::
正如Simon Svensson所建议的,在任何其他命令执行之前打开连接:
ctx.Connection.Open() 当ORM关闭并重新打开连接时,就会发生这种情况。将sqlite内存数据库重置为其默认状态;i、 空的 NHibernate也会发生同样的情况,除非您设置
connection.release\u mode=close
(默认为after\u transaction
)
我不熟悉Entity Framework,但我希望类似的设置或使用构造函数,它被记录为“如果您提供了一个打开的连接,DataContext将不会关闭它”
同样的文档还声明“在System.Transactions事务中,DataContext不会打开或关闭连接以避免升级。”这可能是一个更干净的解决方案
使用一些Reflector魔术表明它是SQLiteConnection.Open调用(通过SQLite3.Open)SQLite3\u Open\u互操作(如果您使用的是NuGet sqlite包)。这表明您每次调用SQLiteConnection.Open时都会得到一个新的空内存数据库。EF是否会关闭/重新打开ExecuteSRecommand和SaveChanges之间的连接?这将重置内存数据库,因为该连接是对它的唯一引用。@Simon,您是正确的。打开连接确实可以解决问题m、 这是与SqLite相关的问题吗?您的内存中数据库在调用SQLiteConnection.Open时被实例化,因此您需要管理对该方法的调用。我已添加了我的注释作为答案,等待您的接受。;)