首页 > 解决方案 > Dapper insert:用于插入的扁平化类

问题描述

我有一个带有嵌入式子类的类,例如

    public class Parent
    {
        public int Id { get; set; }
        public string Name { get;set;}
        public ValidFor ValidFor { get; set; }
    }

    public class ValidFor 
    {
        public DateTime? StartDateTime { get;set;}
        public DateTime? EndDateTime { get; set; }
    }

但是在使用 Dapper 插入时,我想展平 ValidFor,以便我只插入一个“父”表。我的插入代码和 SQL 如下

  public async Task<Category> Create(Category entity)
  {            
      string sql = "Insert into Parent (Id, Name, StartDateTime, EndDateTime) values (@Id, @Name, @StartDateTime, @EndDateTime)";

      using (var connection = GetConnection)
      {
          await connection.ExecuteAsync(sql, entity);
          return entity;
      }
   }

但我得到了错误

“开始日期时间”不存在

我明白为什么,但是如何将我的对象映射到我的表?我可以在网上找到有关 Multi-Mapping 的示例都集中在多个表上。

我当然可以创建一个不同的类,它是平面的并且与我的表结构匹配,然后在它们之间进行映射(使用 Mapster/Automapper 等),但是由于我有 10 多个类有这个问题,所以这并不实际。

标签: c#postgresqldapper

解决方案


我认为您的架构存在严重问题,但无论如何:

最简单的解决方法是在匿名对象中手动指定参数。

public async Task<Category> Create(Category entity)
{            
    string sql = "Insert into Parent (Id, Name, StartDateTime, EndDateTime) values (@Id, @Name, @StartDateTime, @EndDateTime)";

    using (var connection = GetConnection)
    {
        await connection.ExecuteAsync(sql, new
        {
            entity.Id,
            entity.Name,
            entity.ValidFor.StartDateTime,
            entity.ValidFor.EndDateTime,
        });
        return entity;
    }
}

推荐阅读