有人在他们的项目中成功使用过System.Data.SQLite.Linq吗?
即使在我的项目引用中包含此DLL之后,很明显Linq在构建适当的SQL语句时调用了错误的提供程序。它在SQLiteCommand中抛出异常,并带有以下语句:
INSERT INTO [Inbox]
([Sender], [Subject], [Body], [Date], [ConversationID], [RemoteID], [ReplyTo])
VALUES
(@p0, @p1, @p2, @p3, @p4, @p5, @p6)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
SCOPE_IDENTITY
在SQLite中无效。在构造SQL语句时如何指示System.Data.SQLite.DLL
使用SQLite Linq SQL构建器?
我的DbProviderFactories是:
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
</DbProviderFactories>
这是正确的吗?
其他信息。我的应用程序加载后,即使它位于bin文件夹中,我也看不到VS2012中的模块列表中的System.Data.SQLite.Linq.dll
。这证实了我怀疑我遗漏了明确引用它的东西,但我无法弄清楚它是什么。
谢谢!
答案 0 :(得分:2)
根据进一步的研究,似乎:
System.Data.SQLite.Linq.dll
的类无法使用 DataContext
。可以将其与ObjectContext
一起使用。我正在调查。如果SQLite.Data人员会澄清这一点会很好,但我会单独跟进。
DbLinq
是另一种选择,但是当我尝试它时,它对Blob数据的处理似乎被打破了。具体来说,它似乎使用blob项的字典并将字典中的每个字节存储为偏移量作为键的值。那非常慢。此外,在使用大于旧值的blob更新blob时崩溃了。
Linq2Sql
似乎没有被维护,由于一些模糊的错误,我根本无法让它工作。可能我的要求不仅仅是它的能力。
理想情况下ObjectContext
会奏效。如果做不到这一点,我将放弃Linq并重新使用直接的SQLite访问权限。我仍然欢迎其他任何能够让Linq与SQLite合作的人的见解。我是一个开源项目,所以我不想使用商业提供商。
答案 1 :(得分:1)
我发现System.Data.SQLite.Linq非常错误。
使用DataContext的log方法有助于根据此答案查看生成的SQL https://stackoverflow.com/a/8729736/74585
StringBuilder logBuilder = new StringBuilder();
db.Log = new StringWriter(logBuilder);
string sql = logBuilder.ToString();
例如linq方法.First()将使用SELECT TOP(1)生成SQL ...但Sqlite中不支持TOP(1)。我不得不通过追踪和错误发现很多这样的错误。
SQLite error when accessing first element in table using LINQ