2013-08-17 57 views
5

我正在使用Dapper.net Extensions,並且希望忽略某些屬性而無需編寫完整的自定義映射器。正如你在下面的ClassMapper中看到的,當我真正想做的事情是忽略一個屬性時,會有很多冗餘代碼。什麼是實現這一目標的最佳方式?如何使用Dapper.net擴展忽略類屬性?

我喜歡這裏提供的答案https://stackoverflow.com/a/14649356但我找不到'寫'定義的名稱空間。

public class Photo : CRUD, EntityElement 
{ 
    public Int32 PhotoId { get; set; } 
    public Guid ObjectKey { get; set; } 
    public Int16 Width { get; set; } 
    public Int16 Height { get; set; } 
    public EntityObjectStatus ObjectStatus { get; set; } 
    public PhotoObjectType PhotoType { get; set; } 
    public PhotoFormat2 ImageFormat { get; set; } 
    public Int32 CategoryId { get; set; } 

    public int SomePropertyIDontCareAbout { get; set; } 
} 


public class CustomMapper : DapperExtensions.Mapper.ClassMapper<Photo> 
{ 
    public CustomMapper() 
    { 
     Map(x => x.PhotoId).Column("PhotoId").Key(KeyType.Identity); 
     Map(x => x.ObjectKey).Column("ObjectKey"); 
     Map(x => x.Width).Column("Width"); 
     Map(x => x.Height).Column("Height"); 
     Map(x => x.ObjectStatus).Column("ObjectStatus"); 
     Map(x => x.PhotoType).Column("PhotoType"); 
     Map(x => x.ImageFormat).Column("ImageFormat"); 
     Map(x => x.CategoryId).Column("CategoryId"); 

     Map(f => f.SomePropertyIDontCareAbout).Ignore(); 
    } 
} 

回答

4

WriteAttribute類位於Dapper.Contrib.Extensions命名空間 - 這是Dapper.Contrib項目的一部分。您可以添加通過的NuGet,包被命名爲「Dapper.Contrib」

+2

的Dapper.Contrib包裝上的NuGet ISN」 t似乎更新了lates代碼。我已聯繫店主以更新它。 –

+1

...現在它已更新,希望將來會保持更新。 –

4

正如你可以看到Person.cs,只需撥打AutoMap();在你ClassMapper構造函數。例如:

public class CustomMapper : DapperExtensions.Mapper.ClassMapper<Photo> 
{ 
    public CustomMapper() 
    { 
     Map(x => x.PhotoId).Key(KeyType.Identity); 
     Map(f => f.SomePropertyIDontCareAbout).Ignore(); 
     AutoMap(); 
    } 
} 
+0

這可能會奏效。只需要更好地執行'base.AutoMap()'或將'CustomMapper'類標記爲'sealed'。謝謝 –

3

您可以使用[Computed]修飾屬性,並且該屬性在插入時將被忽略。從語義上它可能不是完美的,但它似乎做的工作:話又說回來

[Computed] 
public int SomePropertyIDontCareAbout { get; set; } 

,彼得裏奇的答案很可能更多的斑點上:

[WriteAttribute(false)] 
public int SomePropertyIDontCareAbout { get; set; }