Неправильные операторы SQL генерируются при использовании System.Data.SQLite.Linq

Кто-нибудь успешно использовал 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. Как указать System.Data.SQLite.DLL использовать построитель SQLite Linq SQL при построении операторов SQL?

Мои DbProviderFactory:

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

это правильно?

Дополнительная информация. Я не вижу System.Data.SQLite.Linq.dll в списке модулей в VS2012, когда мое приложение загружено, даже если оно находится в папке bin. Это подтверждает мое подозрение, что мне не хватает чего-то, что явно ссылается на него, но я не могу понять, что это такое.

Спасибо!


person Steven Palmer    schedule 07.09.2013    source источник
comment
Какой класс DBconnection вы использовали?   -  person Jeroen van Langen    schedule 08.09.2013
comment
Я использую SQLiteConnection: string connectionString = @Data Source= + databasePath + ;provider=System.Data.SQLite; SQLiteConnection db = новый SQLiteConnection(Config.ConnectionString); using (DataContext dc = new DataContext(db)) { // Здесь находится код; }   -  person Steven Palmer    schedule 08.09.2013


Ответы (2)


На основании дальнейших исследований выясняется, что:

  1. System.Data.SQLite.Linq.dll не может использоваться классами на основе DataContext. Возможно, его можно будет использовать с ObjectContext. Я расследую. Было бы неплохо, если бы люди из SQLite.Data разъяснили это, но я слежу за ними отдельно.

  2. DbLinq является альтернативой, но когда я попробовал ее, ее обработка данных Blob казалась нарушенной. В частности, он использует словарь для элементов больших двоичных объектов и сохраняет каждый байт в словаре как значение со смещением в качестве ключа. Это было ужасно медленно. Кроме того, произошел сбой при обновлении большого двоичного объекта новым значением, которое было больше старого.

  3. Linq2Sql, похоже, не поддерживается, и я вообще не смог заставить его работать из-за какой-то неясной ошибки. Возможно, мои требования немного больше, чем его возможности.

В идеале ObjectContext будет работать. В противном случае я откажусь от Linq и вместо этого вернусь к прямому доступу к SQLite. Тем не менее, я бы по-прежнему приветствовал мнение любого, кому удалось заставить Linq работать с SQLite. Мой проект с открытым исходным кодом, поэтому я бы предпочел не использовать коммерческого поставщика.

person Steven Palmer    schedule 08.09.2013

Я обнаружил, что System.Data.SQLite.Linq довольно глючный.

Использование метода журнала DataContext очень помогает при просмотре сгенерированного SQL в соответствии с этим ответом https://stackoverflow.com/a/8729736/74585

StringBuilder logBuilder = new StringBuilder();
db.Log = new StringWriter(logBuilder);
string sql = logBuilder.ToString();

Например, метод linq .First() будет генерировать SQL с помощью SELECT TOP (1)... но TOP (1) не поддерживается в Sqlite. Мне пришлось обнаружить много ошибок, подобных этой, методом проб и ошибок.

Ошибка SQLite при доступе к первому элементу в таблице с использованием LINQ

person Matthew Lock    schedule 08.12.2014