2016-04-05 7 views
3

Я пытаюсь использовать расширение в MvvmCross 4. То, что я пытаюсь сделать, просто: у меня есть две таблицы с отношением один-много и вы хотите получить к ней доступ.Sqlite-net extensions отношения всегда null

У меня есть два класса, BusLine и BusLineGroup. Каждая BusLine имеет одну группу в качестве внешнего ключа. Что я делаю в коде выполняется простой LINQ-запрос, чтобы получить все Шинопроводы:

var testQuery = 
    from busLine in this._connection.Table<BusLine>() 
    select busLine; 

Сам запрос работает, но если я проверить поля возвращенных объектов, Группа всегда null!. Ниже приведены определения классов и таблиц.

debug locals

Что я делаю неправильно? Почему всегда группа null? Спасибо за вашу помощь.


Классы в коде:

public class BusLine 
    { 
     [PrimaryKey, AutoIncrement] 
     public int Id { get; set; } 
     public string Name { get; set; } 
     [ForeignKey(typeof(BusLineGroup))] 
     public int BusLineGroup { get; set; } 
     [ManyToOne] 
     public BusLineGroup LineGroup { get; set; } 
    } 

    public class BusLineGroup 
    { 
     [PrimaryKey, AutoIncrement] 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Color { get; set; } 
     public string MainStations { get; set; } 
     [OneToMany(CascadeOperations = CascadeOperation.All)] 
     public List<BusLine> BusLines { get; set; } 

    } 

Две таблицы:

CREATE TABLE "BusLineGroup" (
    `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    `Name` TEXT NOT NULL, 
    `Color` TEXT NOT NULL, 
    `MainStations` TEXT NOT NULL 
); 
CREATE TABLE "BusLine" (
    `Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    `Name` TEXT NOT NULL, 
    `BusLineGroup` INTEGER NOT NULL, 
    FOREIGN KEY(`BusLineGroup`) REFERENCES `BusLineGroup`(`Id`) 
); 

Установленные NuGet-пакеты:

  • MvvmCross.Plugin.SQLitePCL
  • SQLiteNetExtensions

Примечание: Пакет MvvmCross автоматически включает SQLite.Net-PCL. Таким образом, оба этих двух используют один и тот же PCL.

ответ

3

Вы не используете ни одного Расширения SQLite-Net, вы используете простые методы sqlite.net, которые ничего не знают о ваших отношениях. Вы должны использовать методы WithChildren для чтения и записи отношений из базы данных.

Например, запрос может быть заменен на эту линии:

var testQuery = this._connection.GetAllWithChildren<BusLine>(); 

Это будет также получать первый уровень отношений из базы данных.

Я бы рекомендовал вам взглянуть на SQLite-Net Extensions documentation и на номер sample project.

+0

Не знаю, как я мог бы пропустить это ... Спасибо, сейчас он работает – Felix

+0

Я получаю исключение с ссылкой на null, когда пытаюсь выбрать записи на основе критериев, которые отношение расширения (ManyToOne) не равно нулю. Он бросает NPE, что не имеет смысла, поскольку я только проверяю, является ли оно нулевым, а не разыменовывает его. Связано ли это с тем, что отношения еще не готовы, когда вы выбираете? –

+0

@JamesWierzba Это звучит как другой вопрос. Вы не можете использовать отношения в своих запросах, потому что эти свойства игнорируются sqlite.net. – redent84