【发布时间】:2016-05-20 00:17:50
【问题描述】:
我正在尝试运行嵌套映射,但嵌套对象为空。这意味着在我的情况下 result[0].Location 为空。我将 NPoco 3.3.0-beta3 与 Postgres 一起使用。
这里是代码 sn-p:
var db = new Database(new NpgsqlConnection(configurations["ConnectionStrings:Database"]));
var sql = Sql.Builder
.Append("SELECT r.*, l.* FROM race r")
.Append("INNER JOIN location l ON r.location_id = l.id");
using (db.Connection)
{
db.Connection.Open();
var result = Db.Fetch<RaceEntity>(sql);
// result[0].Location == null
}
RaceEntity:
[TableName("race")]
[PrimaryKey("id", AutoIncrement = true)]
public class RaceEntity
{
[Column("id")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
[Column("location_id")]
public int LocationId { get; set; }
[Column("date")]
public DateTime Date { get; set; }
[ResultColumn]
public LocationEntity Location { get; set; }
}
LocationEntity
[TableName("location")]
[PrimaryKey("id", AutoIncrement = true)]
public class LocationEntity
{
[Column("id")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
[Column("province")]
public string Province { get; set; }
[Column("postal")]
public string Postal { get; set; }
[Column("country")]
public string Country { get; set; }
[Column("iso_code")]
public string IsoCode { get; set; }
}
比赛桌
CREATE TABLE "race" (
"id" SERIAL PRIMARY KEY,
"name" VARCHAR(100) NOT NULL,
"location_id" INTEGER REFERENCES "location" (id),
"date" date NOT NULL
);
位置表
CREATE TABLE "location" (
"id" SERIAL PRIMARY KEY,
"name" VARCHAR(100) NOT NULL,
"province" VARCHAR(100) NULL DEFAULT NULL,
"postal" VARCHAR(30) NULL DEFAULT NULL,
"country" VARCHAR(70) NOT NULL,
"iso_code" VARCHAR(10) NULL DEFAULT NULL
);
【问题讨论】:
-
抱歉,只需要在这里发表一个转义评论:我不明白当类都是属性装饰时,他们如何将 poco 这个词放在名称中......这根本不是 POCO !我的意思是,只要看看 petapoco,你就会明白我的意思......
-
@code4life,这些 [Column] 映射都不是必需的,[PrimaryKey] 装饰也不是必需的。 NPoco 会自动正确映射所有这些列名,而无需任何修饰,并且它会假定 Id 作为自动递增的主键。表名是必需的,但这仅仅是因为他在其中添加了“实体”一词。如果他有一个文件夹“实体”并调用类 Entity.Location 和 Entity.Race,那么也不需要这些标记。 [ResultColumn] 装饰是因为他想将它们一起返回,但懒得从他的实体类中单独创建一个结果类。