Dapper不能忽略参数的嵌套对象?

时间:2015-10-13 19:39:56

标签: dapper dapper-extensions

我开始使用Dapper并且喜欢它到目前为止。然而,随着我进一步进入复杂性,我遇到了一个大问题。您可以将整个自定义对象作为参数传递这一事实非常棒。但是,当我添加另一个自定义对象属性时,它不再起作用,因为它尝试将对象映射为SQL参数。有没有办法让它忽略作为传递的主要对象的属性的自定义对象?以下示例

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

propery名称映射很好,但属性MyCar失败,因为它是一个自定义对象。如果Dapper无法解决这个问题,我将不得不对我的整个项目进行重组......好好打哈哈

2 个答案:

答案 0 :(得分:1)

Dapper扩展有一种创建自定义地图的方法,它允许您忽略属性:

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

答案 1 :(得分:0)

这个问题有一个更简单的解决方案。

如果属性MyCar不在数据库中,并且可能不是,那么简单地删除{get; set;}和&#34;属性&#34;成为一个字段,DapperExtensions会自动忽略它。如果您实际上是将这些信息存储在数据库中,并且它是一个多值属性,而不是序列化为JSON或类似格式,我想您可能会要求您不想要的复杂性。没有sql对应的对象&#34; Car&#34;,并且模型中的属性必须映射到sql识别的内容。

更新:

如果&#34; Car&#34;是数据库中表的一部分,然后您可以使用Dapper的QueryMultiple将其读入CarMaker对象。

我以这种方式使用它:

.sticky {
    width: 600px;
    transition: background-color 0.4s ease;
    /* other properties... *.
}

Request Class有一个字段:

dynamic reader = dbConnection.QueryMultiple("Request_s", param: new { id = id }, commandType: CommandType.StoredProcedure);
if (reader != null)
{
    result = reader.Read<Models.Request>()[0] as Models.Request;
    result.reviews = reader.Read<Models.Review>() as IEnumerable<Models.Review>;    
}

存储过程如下所示:

public IEnumerable<Models.Review> reviews;

在第一次阅读中,Dapper忽略了现场评论,在第二次阅读中,Dapper将信息加载到字段中。如果返回null集,Dapper将加载带有null集的字段,就像它将加载具有null内容的父类一样。

然后第二个select语句读取完成对象所需的集合,Dapper存储输出,如图所示。

在目标父类有多个同时显示的子类的情况下,我一直在我的Repository类中实现它。

这可以防止多次访问数据库。

当目标类是子类时,您也可以使用此方法,并且您需要有关与其相关的父类的信息。