.NET 4.0 Linq SQLite DbLink — как мне заставить все это работать вместе?

#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, там есть куча хороших примеров.

Патрик.