编写一个为存储过程建模以供Dapper使用的类

时间:2014-03-29 19:53:22

标签: oracle stored-procedures dapper

我已经按照http://blog.vijay.name/2012/07/dapper-micro-orm-for-oracle-and-microsoft-net/上的示例来使用我现有的一些Oracle存储过程实现Dapper。但是,我对这个例子有点不满意,因为这个块:

using ( var multi = cnn.QueryMultiple( "PKG_USERS.GetUserDetailsForID", param: p, commandType: CommandType.StoredProcedure ) )
{
    u = multi.Read<User>( ).Single( );
    u.Roles = multi.Read<UserRole>.ToList( );
}

当然,这个逻辑很容易遵循,但如果我有1000个这样的实现呢?

我希望能够为每个存储过程定义一个类(模型) ,然后根据以下约定使用某个上下文(包括IDbConnection)执行它:< / p>

  • 模型的每个属性都是存储过程的参数
  • 存储过程的每个输出参数都通过规则名称=名称映射到模型的相应参数。

所以我的模型看起来像这样:

public class ConcreteSPModel : AbsSPModel
{
    public string ParamOne { get; set; }
    public string ParamTwo { get; set; }
    //Attributes or other markup to indicate that this is an output parameter
    public List<OtherModel> ParamThree { get; set; }
}

我会填写:

var params = new OracleDynamicParameters(myConcrete);
using (var m = Connection.QueryMultiple(myConcrete.CommandText(), param: params, commandType: myConcrete.CommandType())
{
    myConcrete.FillWith(m);

    // OR...

    this.FillModel(myConcrete, m);
}

我之前在没有Dapper的情况下使用反射实现了类似的东西,但在我沿着这条路走下去之前我想知道Dapper中是否有任何东西可以让我避免编写我自己的代码来迭代在公共属性上并通过为其泛型参数和泛型类型调用Read方法来分配每个属性?

1 个答案:

答案 0 :(得分:-1)

听起来你还没有致力于精打细算。如果是的话......

查看Insight.Database。它支持Oracle,存储过程,多个记录集,深层结果结构等。

只需在方法上定义接口即可绑定到proc。

http://github.com/jonwagner/Insight.Database