Dapper 扩展:class 具有复合字段,映射到个人 table

Dapper Extension: class with composite fields, mapped to an individual table

我有以下 类:

public class Publication
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Headline { get; set; }
    public DateTime Published { get; set; }
    public ProductContact Contact { get; set; }
}

public class ProductContact
{
    public string FullName { get; set; }
    public string JobTitle { get; set; }
    public string Email { get; set; }
}

与此结构关联的 table "Publications" 具有所有这些字段(包括 ProductContact 的属性)。

如果我尝试插入发布行(包含 ProductContact 信息),程序会抛出异常:

System.NotSupportedException: The member Contact of type ProductContact cannot be used as a parameter value

因此,我添加了一个映射器以将 ProductContact 属性映射到属性 table:

中的字段
  public PublicationMapper ()
    {
        TableName = "Publications";

        Map(x => x.Contact.FullName).Column("ContactFullName");
        Map(x => x.Contact.JobTitle).Column("ContactJobTitle");
        Map(x => x.Contact.Email).Column("ContactEmail");

        AutoMap();
    }

使用这个映射器我得到了同样的异常。

然后,我为 Contact 字段添加了忽略语句,告诉 Dapper 不要在插入语句中包含该元素

            Map(x => x.Contact).Ignore();

在这种情况下,我得到另一个异常:

System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@FullName".

说明Dapper完全忽略了这个属性,上一步添加的映射没有效果

有没有办法将 ProductContact 属性映射到 table 字段?

谢谢。

我认为 DapperExtensions 不可能做到这一点。

one of their issues中,他们说

Currently, we aren't planning to support nested objects. However, you can create your own Mapper that will allow for skipping over the nested object

我尝试了多种方法和不同的映射 classes,但无济于事 - 我认为它们不支持映射嵌套 属性 值的任何方式 忽略属性本身(如果不这样做,将导致"cannot be used as a parameter value"错误)。

一种方法是手动将您的对象展平为匿名 class(正如@juharr 在对您的问题的评论中所建议的那样),另一种方法是使用 AutoMapper 之类的东西来展平您的复杂对象变成扁平插入模型。