【问题标题】:Nested object mapping with NPoco 3使用 NPoco 3 的嵌套对象映射
【发布时间】: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] 装饰是因为他想将它们一起返回,但懒得从他的实体类中单独创建一个结果类。

标签: c# npoco


【解决方案1】:

Location 属性中删除属性[ResultColumn]Location 属性不是数据库中的列,因此不需要该属性。

即使属性是数据库中的一列,您也需要注意NPoco wiki中的以下内容

注意:这些列需要在 SQL 中明确指定。 它不会包含在自动生成的 SQL 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2013-08-01
    • 2014-02-25
    • 1970-01-01
    相关资源
    最近更新 更多