Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle存储过程与.Net的ORM样式映射_.net_Database_Oracle_Orm - Fatal编程技术网

Oracle存储过程与.Net的ORM样式映射

Oracle存储过程与.Net的ORM样式映射,.net,database,oracle,orm,.net,Database,Oracle,Orm,我正在寻找某种工具来帮助从.Net代码调用Oracle存储过程。我们有一个很大的遗留数据库,坦率地说有点混乱(没有id字段、大的组合键和重复数据)。目前,我们必须通过一个旧的、有缺陷的自定义库通过存储过程进行所有数据访问,我想替换它 我对像nHibernate这样的ORM工具有一些经验,但在我们的环境中使用它一点之后,它似乎并不是处理像这样的遗留数据库的最佳选择 是否有人知道一个好的工具,可以轻松调用存储过程并将结果映射到对象集/集合中?一个很好的好处是处理连接事务的能力 如果商业图书馆是一个选

我正在寻找某种工具来帮助从.Net代码调用Oracle存储过程。我们有一个很大的遗留数据库,坦率地说有点混乱(没有id字段、大的组合键和重复数据)。目前,我们必须通过一个旧的、有缺陷的自定义库通过存储过程进行所有数据访问,我想替换它

我对像nHibernate这样的ORM工具有一些经验,但在我们的环境中使用它一点之后,它似乎并不是处理像这样的遗留数据库的最佳选择

是否有人知道一个好的工具,可以轻松调用存储过程并将结果映射到对象集/集合中?一个很好的好处是处理连接事务的能力


如果商业图书馆是一个选择,那就谢谢你了,我们真的很喜欢Devart(见)。。。它们支持LINQ、PLINQ和EF以及存储过程、REF游标等—从Oracle 7.3到11g/.NET 2和更高版本的/32+64位


没有附属关系,只是一个快乐的客户…

如果商业图书馆是一个选择,我们真的很高兴与德瓦特(见)。。。它们支持LINQ、PLINQ和EF以及存储过程、REF游标等—从Oracle 7.3到11g/.NET 2和更高版本的/32+64位


没有附属关系,只是一个快乐的客户…

新的Oracle beta Entity Framework驱动程序可以让您做到这一点。您可以将SP映射到模型中,也可以映射到实体(如果它们返回的是表的等效项),或者创建“复杂类型”,它是围绕SP返回的内容构建的类

我不知道你打了多少个SP,但我试过的那个已经成功了

另一种选择是编写自己的库,只调用过程并以.net类的形式返回结果,但这将需要您在重复代码方面进行大量的设置工作(在Oracle中,将参数映射到过程会非常繁琐)

编辑-这里有一个配置文件条目,用于使用存储过程,其中结果来自作为OUT参数的游标

  <oracle.dataaccess.client>
    <settings>
      <add name="ENVMSTR.P_ORG_UNIT_R_BY_STAFF.RefCursor.RESULT_CURSOR_P" value="implicitRefCursor bindinfo='mode=Output'" />
    </settings>
  </oracle.dataaccess.client>

新的Oracle beta Entity Framework驱动程序允许您这样做。您可以将SP映射到模型中,也可以映射到实体(如果它们返回的是表的等效项),或者创建“复杂类型”,它是围绕SP返回的内容构建的类

我不知道你打了多少个SP,但我试过的那个已经成功了

另一种选择是编写自己的库,只调用过程并以.net类的形式返回结果,但这将需要您在重复代码方面进行大量的设置工作(在Oracle中,将参数映射到过程会非常繁琐)

编辑-这里有一个配置文件条目,用于使用存储过程,其中结果来自作为OUT参数的游标

  <oracle.dataaccess.client>
    <settings>
      <add name="ENVMSTR.P_ORG_UNIT_R_BY_STAFF.RefCursor.RESULT_CURSOR_P" value="implicitRefCursor bindinfo='mode=Output'" />
    </settings>
  </oracle.dataaccess.client>

如果您只想使用参数化和物化(将数据转化为对象)进行存储过程处理,那么它简单、极简,应该可以在Oracle上正常工作;例如:

var user = cnn.Query<User>("spGetUser", new {Id = 1}, 
    commandType: CommandType.StoredProcedure).First();
var user=cnn.Query(“spGetUser”,new{Id=1},
commandType:commandType.StoredProcess.First();
要点:

  • spGetUser
    是存储过程的名称
  • 它作为存储过程通过
    commandType
  • 参数是从传入的对象推导出来的;在这种情况下,假设有一个名为
    Id
    的参数,该参数接受一个整数,并传入值
    1
  • 应用直接列到属性映射,为返回的每一行构造一个
    User
    对象
  • 在本例中,我们还使用LINQ to对象来演示如何简单地读取一行

请注意,还支持映射多个数据网格和水平分区(到相关图形中的不同对象中)。

如果您只想使用参数化和物化(数据到对象中)进行存储过程处理,则该方法简单、最简单,应能在Oracle上正常工作;例如:

var user = cnn.Query<User>("spGetUser", new {Id = 1}, 
    commandType: CommandType.StoredProcedure).First();
var user=cnn.Query(“spGetUser”,new{Id=1},
commandType:commandType.StoredProcess.First();
要点:

  • spGetUser
    是存储过程的名称
  • 它作为存储过程通过
    commandType
  • 参数是从传入的对象推导出来的;在这种情况下,假设有一个名为
    Id
    的参数,该参数接受一个整数,并传入值
    1
  • 应用直接列到属性映射,为返回的每一行构造一个
    User
    对象
  • 在本例中,我们还使用LINQ to对象来演示如何简单地读取一行

请注意,还支持映射多个数据网格和水平分区(到相关图形中的不同对象中)。

对于那些试图使用Oracle实现实体框架功能导入的用户,您可以使用以下演练:

我还写了一篇杂志文章,其中包括一个演练:

注意:在发布此帖子时,由于beta3中的app.config关键字发生了一些更改,这些Walkthough不起作用。请参阅beta3的ODP.NET目录中的自述文件

已更改的影响漫游的关键字可以修改如下:

本机数据类型到本机数据类型

PROVIDER_DB_TYPE到PROVIDERDBTYPE

请参阅ODT目录中的自述文件,以了解有关此问题的其他注意事项。在(将来的)生产版本中(发布本文时不可用),OracleDeveloperToolsforVisualStudioOnline帮助有一个名为“使用实体框架”的部分。本节包含有关映射到存储过程和函数的注意事项。请阅读此文档

有关此app.config元数据格式的更多信息,请参阅“隐式引用游标绑定支持”se中的ODP.NET联机帮助