1

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

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

属性名称映射正常,但属性 MyCar 失败,因为它是自定义对象。如果 Dapper 无法处理这个问题,我将不得不重组我的整个项目……这太棒了,哈哈

4

2 回答 2

2

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

这是一个链接

于 2015-10-14T16:29:57.143 回答
1

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

如果属性 MyCar 不在数据库中,而且很可能不在,那么简单地删除 {get;set;} 并且“属性”成为一个字段并被 DapperExtensions 自动忽略。如果您实际上将此信息存储在数据库中,并且它是一个未序列化为 JSON 或类似格式的多值属性,我认为您可能要求的是您不想要的复杂性。没有对象“汽车”的 sql 等效项,并且模型中的属性必须映射到 sql 识别的东西。

更新:

如果“Car”是数据库中表的一部分,那么您可以使用 Dapper 的 QueryMultiple 将其读入 CarMaker 对象。

我以这种方式使用它:

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;

存储过程如下所示:

ALTER PROCEDURE [dbo].[Request_s] 
(
@id int = null
)
AS
BEGIN
    SELECT *
    FROM [biospecimen].requests as bn
    where bn.id=coalesce(@id, bn.id)
    order by bn.id desc;
    if @id is not null
    begin
        SELECT 
            *
        FROM [biospecimen].reviews as bn
        where bn.request_id = @id;
    end
END

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

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

在目标父类有多个同时显示的子类的情况下,我一直在我的存储库类中实现这一点。

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

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

于 2015-11-16T17:09:02.803 回答