Sqlite-net扩展关系始终为空

3
我正在尝试在MvvmCross 4中使用扩展。我的目标很简单:我有两个具有一对多关系的表格,想要访问它们。
我有两个类BusLineBusLineGroup,每个BusLine都有一个Group作为外键。我在代码中运行一个简单的LINQ查询来获取所有Buslines:
var testQuery = 
    from busLine in this._connection.Table<BusLine>()
    select busLine;

查询本身是可以工作的,但是如果我检查返回对象的字段,Group总是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。

1个回答

5

您在这里没有使用任何SQLite-Net Extensions方法,而是使用了纯sqlite.net方法,它们对您的关系一无所知。您必须使用WithChildren方法从数据库中读取和写入关系。

例如,您的查询可以替换为以下代码:

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

这也将从数据库中获取一级关系。

我建议您查看SQLite-Net Extensions文档示例项目以获取更多示例。


不知道我怎么会错过那个...谢谢,现在它可以工作了。 - Felix
当我尝试根据一个扩展关系(ManyToOne)不为空的条件选择记录时,我会收到一个空引用异常。它抛出了一个NPE,这是没有意义的,因为我只是检查它是否为空,而没有对其进行解引用。这是否与在选择时关系还没有准备好有关? - James Wierzba
@JamesWierzba 这听起来像是一个不同的问题。你不能在查询中使用关系,因为这些属性被sqlite.net忽略了。 - redent84
我正在使用GetAllWithChildren,我忘了提到了。那是一个sqlite net扩展方法,对吧?无论如何,可能应该将其作为自己的问题,但我找到了一个解决方法,所以不用担心,谢谢。 - James Wierzba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接