2010-01-05 4 views
0

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

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

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

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

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

EDIT Там, как представляется sometraffic на сайте провайдера, но никаких решений.

EDIT Поскольку я, похоже, смутил вопрос, вот как я настроил свое приложение. Надеюсь, это поможет пролить свет на мой мыслительный процесс и, возможно, основной вопрос.

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

хммы .. DBML = Linq-to-SQL = SQL только сервер. Не знаете, что вы пытаетесь сделать здесь, но не являются ли файлы DBML частью Linq-to-SQL, которая предназначена только для сервера SQL Server? –

+0

Я должен был упомянуть ... Я использую System.Data.SQLite (http://sqlite.phxsoftware.com/) как бэкэнд, который поддерживает ADO.NET Entity Framework. – jheddings

+0

Не могли бы вы уточнить, используете ли вы LINQ to SQL/DBML (который не поддерживает SQLite) в соответствии с вашим вопросом и тегами или Entity Framework/EDMX (который поддерживает SQLite через указанную вами библиотеку) в соответствии с вашим комментарий? – itowlson

ответ

3

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

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

alt text http://i46.tinypic.com/2cgekr8.png

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

+0

Спасибо за ответ ... и облом. Я не понимал, что LINQ to SQL настолько тесно связан с SQL-сервером. К сожалению, у меня нет возможности создать ADO.NET Entity Data Model (DevStudio Standard). LINQ to SQL отлично подходит для простых запросов и вставок, но, похоже, до сих пор не работает только для этого случая. – jheddings

0

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

0

Я столкнулся с той же проблемой и нашел следующий обходной путь - использовать 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"); 
    } 
}; 
Смежные вопросы