Dapper是否支持使用存储过程的强类型对象?

dapper query-by-example stored-procedures

基本上,我想对存储过程使用“漂亮”的Dapper语法,而不必手动使用exec MySproc @p1, @p2, @p3, @p4等,但我需要能够强有力地传入设置了各种属性的类型化对象,并将此对象用于映射参数。我知道我可以用一个匿名对象来做这个,但是我想到的场景就像一个复杂的搜索表单,可以搜索几个字段,相应的存储过程可以有很多参数(很多都有默认值) )。

理想情况下,我希望能够做到这样的事情:

var cust = new Customer();
cust.FirstName = ...
cust.LastName = ...

// using .NET 3.5 so need to use ugly syntax :(
var result = connection.Query<Customer>("MySproc", cust, null, false, null, CommandType.StoredProcedure).Single();

但是,这不起作用并抛出错误,因为我的Customer对象可能有十几个或更多属性,而我在这种情况下只寻找两个; Dapper似乎只是检查每个属性并分配一个值,假设在sproc中有可能没有的相应参数。

我可以使用PetaPoco(传入强类型对象匿名对象)做类似的事情,但我正在寻找比PetaPoco更抽象的东西。

我想在Dapper中做什么(或者其他微型ORM?我不能使用NHibernate或重量级ORM),或者是否有一种方法我可以忽略得到相同的功能而不必写一个exec语句用什么可能是十几个参数?

一般承认的答案

如果您想指定参数,则需要明确指定:

var dp = new DynamicParameters(); 
dp.Add("Id", cust.Id);
dp.Add("Name", cust.Name);
var result = connection.Query<Customer>("MySproc", 
         dp,
         null, 
         false, 
         null, 
         CommandType.StoredProcedure).Single();

我们不会对sp_help params嗅探,尽管你可能会构建一个帮助程序,并允许你运行: cust.ToProcParams('MySproc')

或者,如果要动态构建此参数,则可以使用。

var dp = new DynamicParameters(); 
dp.Add("Id", cust.Id);
dp.Add("Name", cust.Name);
var result = connection.Query<Customer>("MySproc", 
         dp,
         null, 
         false, 
         null, 
         CommandType.StoredProcedure).Single();

热门答案

如果您使用的是SQL Server,请查看Insight.Database。 https://github.com/jonwagner/Insight.Database/wiki它更面向存储过程,并使用SqlDeriveParameters来确定对象和存储过程之间的映射。

注意:它目前需要.NET 4.0,但如果你真的对.NET 3.5版本感兴趣,我可以看到它会有多难。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因