小巧玲珑扩展:类复合字段,被映射到一个单独的表

问题描述:

我有以下类:小巧玲珑扩展:类复合字段,被映射到一个单独的表

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)。

如果我尝试插入出版物行(与ProductContact信息包括)该计划抛出一个异常:

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

所以,我添加了一个映射到ProductContact属性映射出在属性表中的字段:

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(); 
    } 

有了这个mapper,我得到了同样的例外。

然后,我添加了忽略语句联系人字段,告诉小巧玲珑不包括在INSERT语句

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

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

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

它表示Dapper完全忽略此属性,并且在上一步中添加的映射不起作用。

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

谢谢。

+0

为什么不只是一个匿名类'new {pub.Id,pub.Title,......,ContactFullName = pub.Contact.FullName,ContactJobTitle = pub.Contact.JobTitle,ContactEmail = pub.Contact.Email }'?尽管听起来像“ContactFullName”实际上应该只是“FullName”,以与SQL中的参数名称相匹配。显示SQL和完整的Dapper调用在这里也有帮助。 – juharr

+0

不幸的是,它不能/不会这样做。试图向管理层证明Dapper是帮助减少代码和易用性的方法。特别是当对象及其数据对象名称不同时。呃,好吧 – zerohero

我不认为这是可能的DapperExtensions。

one of their issues,他们说

目前,我们不打算支持嵌套对象。但是,您 可以创建自己的映射,将允许跳过的 嵌套对象

我已经尝试了不同的方法和不同的映射类,不能取得任何进展 - 我不认为他们支持任何方式映射嵌套属性值忽略属性本身(如果不这样做,将导致“不能用作参数值”错误)。

一种方法是手动将你的对象变成一个匿名类(如@juharr在你的问题的评论中所建议的),另一种方法是使用类似AutoMapper的东西来将你的复杂对象压平成扁平插入模型。