.NET 4.0 + Linq + SQLite + DbLink - как мне заставить все это работать вместе? - PullRequest
1 голос
/ 09 ноября 2011

Я разрабатываю (или пытаюсь разработать) проект на 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 голос
/ 25 ноября 2011

Я предполагаю, что вы используете Entity Framework для ORM?

В вашем классе MyDatabase вы наследуете от DataContext . Представляет основную точку входа для инфраструктуры LINQ to SQL. Это хорошо работает для SQL Server. Не очень хорошо с SQLite.

Вместо этого наследуйте от ObjecContext класса. Это обеспечивает возможности для запроса и работы с данными объекта как объектами. Возможно, вам придется изменить код, который вы используете для своих запросов, но он должен быть довольно простым.

Выполните поиск в Entity Framework и ObjectContext, есть много хороших примеров.

Patrick.

...