Sqlite-net 扩展关系始终为空
Sqlite-net extensions relations always null
我正在尝试使用 MvvmCross 4 中的扩展。我想做的很简单:我有两个具有一对多关系的 table 并且想要访问它。
我有两个 class,BusLine
和 BusLineGroup
。每个 BusLine 都有一个 Group 作为外键。我在代码中所做的是 运行 一个简单的 LINQ 查询来获取所有总线:
var testQuery =
from busLine in this._connection.Table<BusLine>()
select busLine;
查询本身有效,但如果我检查返回对象的字段,组总是 null
!。请参阅下面的 class 和 table 定义。
我做错了什么?为什么组总是null
?感谢您的帮助。
代码中的classes:
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; }
}
两个table:
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.
您没有使用任何 SQLite-Net Extensions 方法,您使用的是对您的关系一无所知的普通 sqlite.net 方法。您必须使用 WithChildren
方法从数据库读取和写入关系。
例如,您的查询可以替换为此行:
var testQuery = this._connection.GetAllWithChildren<BusLine>();
这也将从数据库中获取一级关系。
我建议您查看 SQLite-Net Extensions documentation and the sample project 以获得更多示例。
我正在尝试使用 MvvmCross 4 中的扩展。我想做的很简单:我有两个具有一对多关系的 table 并且想要访问它。
我有两个 class,BusLine
和 BusLineGroup
。每个 BusLine 都有一个 Group 作为外键。我在代码中所做的是 运行 一个简单的 LINQ 查询来获取所有总线:
var testQuery =
from busLine in this._connection.Table<BusLine>()
select busLine;
查询本身有效,但如果我检查返回对象的字段,组总是 null
!。请参阅下面的 class 和 table 定义。
我做错了什么?为什么组总是null
?感谢您的帮助。
代码中的classes:
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; }
}
两个table:
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.
您没有使用任何 SQLite-Net Extensions 方法,您使用的是对您的关系一无所知的普通 sqlite.net 方法。您必须使用 WithChildren
方法从数据库读取和写入关系。
例如,您的查询可以替换为此行:
var testQuery = this._connection.GetAllWithChildren<BusLine>();
这也将从数据库中获取一级关系。
我建议您查看 SQLite-Net Extensions documentation and the sample project 以获得更多示例。