Отношения расширений Sqlite-net всегда равны нулю

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

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

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

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

отлаживать локальные

Что я делаю неправильно? Почему группа всегда 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.


person Felix    schedule 05.04.2016    source источник


Ответы (1)


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

Например, ваш запрос можно заменить этой строкой:

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

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

Я рекомендую вам ознакомиться с документацией SQLite-Net Extensions. и пример проекта для большего количества примеров.

person redent84    schedule 05.04.2016
comment
Не знаю, как я мог это пропустить... Спасибо, теперь работает - person Felix; 05.04.2016
comment
Я получаю исключение нулевой ссылки, когда пытаюсь выбрать записи на основе критерия, согласно которому связь расширения (ManyToOne) не является нулевой. Он выдает NPE, что не имеет смысла, поскольку я только проверяю, является ли оно нулевым, а не разыменовывает его. Это как-то связано с тем, что отношения еще не были готовы при выборе? - person James Wierzba; 24.01.2017
comment
@JamesWierzba Это звучит как другой вопрос. Вы не можете использовать отношения в своих запросах, потому что эти свойства игнорируются sqlite.net. - person redent84; 24.01.2017
comment
Я использую GetAllWithChildren Я забыл упомянуть об этом. Это метод расширения sqlite net, нет? В любом случае, да, это, вероятно, должен быть отдельный вопрос, но я нашел обходной путь, так что не беспокойтесь, спасибо - person James Wierzba; 24.01.2017