2015-02-07 46 views
3

我有我的小巧玲瓏的ORM以下複雜的模型建立和拒不堅持:堅持複雜的物體與精緻小巧的ORM

const string sqlQuery = "INSERT INTO Reports (created_at, post_name) VALUES (@CreatedAt, @PostData.PostName)"; 
_connection.Execute(sqlQuery, report); 

namespace Foobar.Models 
{ 
    public class Report 
    { 
     public int Id { get; set; } 
     public DateTime CreatedAt { get; set; } 
     public PostData PostData { get; set; } 
    } 

    public class PostData 
    { 
     public string title { get; set; } 
     public double index { get; set; } 
    } 
} 

這是我得到的錯誤:

The member PostData of type Foobar.Models.PostData cannot be used as a parameter value 

回答

2

嘗試使用匿名對象:

const string sqlQuery = 
    "INSERT INTO Reports (created_at, post_name) VALUES (@CreatedAt, @PostName)"; 

_connection.Execute(sqlQuery, new { CreatedAt = report.CreatedAt, 
            PostName = report.PostData.PostName }); 

您所擁有的問題是您正在有效地嘗試通過PostData對象作爲名爲PostData.PostName的SQL參數的值。

請記住,"@parameter"語法是原始SQL,而不是Dapper本身的功能。映射過程沒有階段涉及將SQL參數名稱解​​釋爲針對您傳遞的對象的表達式。該映射的工作原理是簡單地將參數名稱與屬性名稱進行匹配,並從傳遞的對象中注入相應的值。

+0

但這些表達式不被dapper支持? – vinnylinux 2015-02-07 21:58:06

+0

@vinnylinux我試圖在我的回答中進一步解釋。 – 2015-02-07 22:02:10

+0

選擇該對象時是否一樣? – vinnylinux 2015-02-08 03:40:50