Использование функции автосинхронизации DBML с SQLite - PullRequest
0 голосов
/ 05 января 2010

У меня возникают проблемы при попытке использовать функцию автоматической синхронизации DBML с SQLite. В моей модели данных есть класс, который содержит первичный ключ (id). Этот ключ определен как «INTEGER PRIMARY KEY», который SQLite отображает на rowid строки. Чтобы поддержать это, я установил «Auto Generated Value» на «True» и «Auto-Sync» на «OnInsert».

Проблема в том, что когда я фиксирую новую запись в базе данных, строка SELECT, используемая классами LINQ to SQL, не поддерживается SQLite:

SELECT CONVERT(BigInt,SCOPE_IDENTITY()) AS [value]

Вместо этого SQLite имеет функцию last_insert_rowid(), на которую я не могу указать.

Кто-нибудь знает, как это исправить? Возможно, изменив оператор, использованный для выбора идентификатора последней строки, или какой-то другой трюк, который мне не хватает?

РЕДАКТИРОВАТЬ Похоже, что некоторый трафик на сайте провайдера, но без разрешения.

РЕДАКТИРОВАТЬ Поскольку я, кажется, запутал вопрос, вот как я настроил свое приложение. Надеюсь, это поможет пролить некоторый свет на мой мыслительный процесс и, возможно, на основную проблему.

  • Добавить новый файл "LINQ to SQL Classes" в мое решение
  • Модель моей базы данных в конструкторе с именем DataModel
  • Открыть базу данных, используя System.Data.SQLite.SQLiteConnection
  • Инициализировать экземпляр DataModel, используя это соединение

Ответы [ 3 ]

3 голосов
/ 05 января 2010

Вы добавляете модель данных «Linq-to-SQL» в свой проект, но используете ее с SQLite - это, конечно, никогда не сработает! Linq-to-SQL только всегда поддерживает SQL Server (всегда есть, всегда будет), и, следовательно, его операторы SQL, которые он генерирует, являются операторами SQL Server T-SQL - ничего больше.

Если вы хотите использовать Entity Framework с SQLite, вам нужно использовать «Модель данных ADO.NET Entity» (файл с расширением .EDMX) в качестве модели данных.

alt text

Только это будет поддерживать сторонние драйверы баз данных, такие как SQLite и другие!

0 голосов
/ 11 июля 2017

Я столкнулся с той же проблемой и нашел следующий обходной путь - используйте событие SQLiteConnection.Changed, чтобы перехватить запрос и исправить его:

SQLiteConnection.Changed += (obj, eventArgs) => {
    var cmd = eventArgs.Command;
    if (eventArgs.EventType == SQLiteConnectionEventType.NewDataReader && cmd != null)
    {
        cmd.CommandText = cmd.CommandText.Replace( @"SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]"
                                                    , @"; SELECT last_insert_rowid() AS value");
    }
};
0 голосов
/ 05 января 2010

Devart реализация LINQ to SQLite не содержит этой проблемы. Столбец autoincrememnt обрабатывается правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...