如何使用Dapper.net扩展忽略类属性

本文关键字:属性 扩展 何使用 Dapper net | 更新日期: 2023-09-27 18:27:59

我正在使用Dapper.net扩展,希望忽略某些属性,而不必编写完整的自定义映射程序。正如你在下面的ClassMapper中看到的,当我真正想做的只是忽略一个属性时,有很多冗余代码。实现这一目标的最佳方式是什么?

我喜欢这里提供的答案https://stackoverflow.com/a/14649356但我找不到定义了"Write"的命名空间。

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

如何使用Dapper.net扩展忽略类属性

WriteAttribute类位于Dapper.Contrib.Extensions命名空间中,该命名空间是Dapper.Contrib项目的一部分。您可以通过nuget添加,该包名为"Dapper.Contrib"

正如您在Person.cs中看到的,只需在ClassMapper的构造函数中调用AutoMap();。例如:

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

您可以用[Computed]装饰属性,插入时会忽略该属性。从语义上讲,它可能并不完美,但它似乎起到了作用:

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

再说一遍,彼得·里奇的答案可能更准确:

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