【发布时间】:2013-07-02 20:52:42
【问题描述】:
在 SqlLite 文件数据库上使用此代码时,它工作正常。
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);
}
}
但是在 SqlLite 'In Memory' 数据库 (Data Source=:memory:;Version=3;New=True;) 上运行此代码时,我得到了这个异常:
未处理的异常: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 测试的
::: 更新 :::
正如 Simon Svensson 建议的那样,在任何其他命令之前打开连接确实可以解决问题:
ctx.Connection.Open();
【问题讨论】:
-
EF 是否会关闭/重新打开 ExecuteStoreCommand 和 SaveChanges 之间的连接?这将重置内存数据库,因为连接是对它的唯一引用。
-
@Simon,你是对的。打开连接确实可以解决问题。这是 SqlLite 相关的问题吗?
-
您的内存数据库在调用 SQLiteConnection.Open 时被实例化,因此您需要管理对该方法的调用。我已添加我的评论作为等待您接受的答案。 ;)
标签: c# sql entity-framework sqlite