#c# #.net #linq #sqlite #dblinq
#c# #.net #linq #sqlite #dblinq
Вопрос:
Я разрабатываю (или пытаюсь разработать) проект на C #, который хранит данные в базе данных SQLite. Я хотел бы использовать Linq для объектно-реляционного сопоставления. Согласно тому, что я прочитал, его можно использовать с SQLite, если загрузить System.Data.SQLite и dblinq.
И хотя в основном это работает для чтения данных из базы данных, я получаю синтаксическую ошибку SQL при попытке вставить что-либо. Я проверил в журналах, что Linq пытается выполнить такой запрос:
{INSERT INTO [sometable]([columnone], [columntwo])
VALUES (@p0, @p1)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input String (Size = 4000; Prec = 0; Scale = 0) [foo]
-- @p1: Input String (Size = 4000; Prec = 0; Scale = 0) [bar]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
}
Похоже, это SQL-запрос для MS Server, а не SQLite. Вот что огорчает SqlProvider(Sql2008)
. Не следует ли заменить это чем-то, предоставляемым dblinq?
Мой класс базы данных выглядит следующим образом:
[Database]
class MyDatabase : DataContext
{
public LibraryDatabase()
: base(new SQLiteConnection(
"DbLinqProvider=Sqlite; "
"Data Source=database.s3db;"))
{
}
public Table<SomeObject> SomeTable;
}
Строка подключения взята из dblinq wiki.
Почему это не работает? Это потому, что я использую .NET 4.0? Кто-нибудь успешно использовал такую комбинацию? Есть ли другой способ заменить поставщика Linq?
РЕДАКТИРОВАТЬ: Сопоставление таблиц: (хотя я сомневаюсь, что ошибка здесь, поскольку чтение таблицы (с использованием цикла foreach), похоже, работает)
[Table(Name="sometable")]
class Element
{
[Column(Name = "id", IsPrimaryKey = true, IsDbGenerated=true)]
public int Id { get; set; }
[Column(Name="columnone")]
public string PropertyOne {get; set;}
[Column(Name="columntwo")]
public string PropertyTwo {get; set;}
}
Все связи между таблицами были закомментированы для тестирования (не помогает).
Затем вставляется элемент со следующим кодом:
myDatabase.SomeTable.InsertOnSubmit(element);
myDatabase.SubmitChanges();
Комментарии:
1. Как выглядят ваши сопоставления таблиц?
Ответ №1:
Я предполагаю, что вы используете Entity Framework для ORM?
В вашем классе MyDatabase вы наследуете от DataContext. Это представляет собой основную точку входа для платформы LINQ to SQL. Это хорошо работает для SQL Server. Не так хорошо с SQLite.
Вместо этого наследование от класса ObjectContext. Это предоставляет средства для запросов и работы с данными сущностей в виде объектов. Вероятно, вам придется изменить код, который вы используете для своих запросов, но он должен быть довольно простым.
Выполните некоторый поиск в Entity Framework и ObjectContext, там есть куча хороших примеров.
Патрик.