我开始使用Dapper并且喜欢它到目前为止。然而,随着我进一步进入复杂性,我遇到了一个大问题。您可以将整个自定义对象作为参数传递这一事实非常棒。但是,当我添加另一个自定义对象属性时,它不再起作用,因为它尝试将对象映射为SQL参数。有没有办法让它忽略作为传递的主要对象的属性的自定义对象?以下示例
public class CarMaker
{
public string Name { get; set; }
public Car Mycar { get; set; }
}
propery名称映射很好,但属性MyCar失败,因为它是一个自定义对象。如果Dapper无法解决这个问题,我将不得不对我的整个项目进行重组......好好打哈哈
答案 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类中实现它。
这可以防止多次访问数据库。
当目标类是子类时,您也可以使用此方法,并且您需要有关与其相关的父类的信息。