Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqLite内存数据库:创建表不工作?_C#_Sql_Entity Framework_Sqlite - Fatal编程技术网

C# 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

在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逻辑错误或缺失 数据库没有这样的表: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时被实例化,因此您需要管理对该方法的调用。我已添加了我的注释作为答案,等待您的接受。;)