2015-10-13 66 views
0

到目前爲止,我開始使用Dapper並非常喜歡它。然而,隨着我對複雜性的進一步嘗試,我遇到了一個大問題。您可以將整個自定義對象作爲參數傳遞的事實非常好。但是,當我添加另一個自定義對象的屬性時,它不再起作用,因爲它試圖將對象映射爲SQL參數。有沒有辦法讓它忽略作爲被傳遞的主對象的屬性的自定義對象?下面的示例Dapper不能忽略參數的嵌套對象?

public class CarMaker 
{ 
public string Name { get; set; } 
public Car Mycar { get; set; } 
} 

propery名稱映射很好,但屬性MyCar失敗,因爲它是一個自定義對象。我將不得不調整自己的整個項目,如果小巧玲瓏不能處理這裏面......以及打擊哈哈

回答

1

小巧玲瓏的擴展有一個方法來創建自定義地圖,它可以讓你忽略的屬性:

public class MyModelMapper : ClassMapper<MyModel> 
{ 
    public MyModelMapper() 
    { 
     //use a custom schema 
     Schema("not_dbo_schema"); 

     //have a custom primary key 
     Map(x => x.ThePrimaryKey).Key(KeyType.Assigned); 

     //Use a different name property from database column 
     Map(x=> x.Foo).Column("Bar"); 

     //Ignore this property entirely 
     Map(x=> x.SecretDataMan).Ignore(); 

     //optional, map all other columns 
     AutoMap(); 
    } 
} 

這裏是一個link

+0

我見過很多這個「解決方案」的參考。我遇到的問題是如何讓DapperExtensions識別此問題。我試圖覆蓋DapperExtensions的默認行爲,即使它不是和忽略插入字段,但DapperExtensions從不調用代碼,使得以「id」結尾的任何字段和作爲標識字段的int類型的默認行爲。你在哪裏實例化這個特定的代碼,以便DapperExtensions調用它? –

+0

默認情況下,DapperExtensions將在與其嘗試映​​射的類相同的程序集中查找 映射文件。您也可以通過調用SetMappingAssemblies來註冊更多的程序集,例如DapperExtensions.SetMappingAssemblies(new [] {typeof(MyCustomClassMapper).Assembly}); –

+0

和這種行爲是記錄在哪裏? –

0

這個問題有一個更簡單的解決方案。

如果屬性MyCar不在數據庫中,並且可能不是,那麼只需簡單地移除{get; set;},然後「屬性」成爲一個字段,並自動被DapperExtensions忽略。如果你實際上是將這些信息存儲在數據庫中,並且它是一個不被序列化爲JSON或類似格式的多值屬性,我認爲你可能會要求複雜性,而你不想要。沒有對象「Car」的sql等價物,並且模型中的屬性必須映射到sql可識別的內容。