【发布时间】:2023-03-30 20:11:01
【问题描述】:
我已经按照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)执行它:
- 模型的每个属性都是存储过程的一个参数
- 存储过程的每个输出参数都通过规则 name = name 映射到模型的相应参数。
所以我的模型看起来像这样:
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 方法为其泛型参数和泛型类型分配每个?
【问题讨论】:
-
为什么不使用 T4 根据 DB 元数据生成类?我正在用 NPoco 做类似的事情来获取强类型的方法调用来访问数据库。我确实遵循某些 SP 命名约定,即 ClassName_Method。例如 User_GetAll。这使得 SP 的可维护性更容易,因为它们是分组的,并且使我可以将各个方法分成单独的类。 我可以提供这个 T4 代码作为答案,但它与 NPoco 相关,而不是直接与 Dapper 相关。取消这条评论。
标签: oracle stored-procedures dapper