Dapper 扩展:具有复合字段的类,映射到单个表
本文关键字:映射 单个表 字段 复合字 扩展 复合 Dapper | 更新日期: 2023-09-27 17:55:18
我有以下类:
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; }
}
与此结构关联的表"出版物"包含所有这些字段(包括 ProductContact 的属性)。
如果我尝试插入"出版物"行(包含"产品联系人"信息),程序会引发异常:
System.NotSupportedException: The member Contact of type ProductContact cannot be used as a parameter value
因此,我添加了一个映射器,将产品联系人属性映射到属性表中的字段:
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();
}
有了这个映射器,我得到了同样的例外。
然后,我为联系人字段添加了忽略语句,以告诉 Dapper 不要在插入语句中包含此元素
Map(x => x.Contact).Ignore();
在这种情况下,我得到了另一个异常:
System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@FullName".
它表示 Dapper 完全忽略了此属性,并且在上一步中添加的映射不起作用。
有没有办法将产品联系人属性映射到表字段?
谢谢。
我认为这在DapperExtensions中是不可能的。
在他们的一个问题中,他们说
目前,我们不打算支持嵌套对象。但是,你 可以创建您自己的映射器,允许跳过 嵌套对象
我已经尝试了各种方法和不同的映射类,但无处可去 - 我认为它们不支持任何映射嵌套属性值和忽略属性本身的方法(如果不这样做,将导致"不能用作参数值"错误)。
一种方法是手动将对象展平为匿名类(如@juharr在对问题的评论中所建议的那样),另一种方法是使用类似AutoMapper的东西将复杂对象展平为展平插入模型。