ADH*_*ADH 2 c# oracle entity-framework-6
以下代码使用Entity Framework 6和Managed Oracle Providers来调用返回多个游标的Oracle存储过程.
该using声明抛出以下异常:
System.ObjectDisposedException: 'Cannot access a disposed object.Object name: 'OracleConnection'.'
Run Code Online (Sandbox Code Playgroud)
如果我删除using语句,而是使用以下帖子中的代码.我没有错.
为什么using语句导致异常?有人向我建议,Oracle托管提供程序存在一个错误.但是,我的同事使用相同的提供程序,他们的使用声明工作正常.
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using Oracle.ManagedDataAccess.Client;
using System.Data.Entity.Infrastructure;
namespace MyCompany
{
public class MyClass
{
private MyDbContext _dbContext = new MyDbContext();
public MyItems GetMyItems(string id)
{
var sqlQuery = "";
var oracleParameters = new List<OracleParameter>();
var oneEntityList = new List<OneEntity>();
var twoEntityList = new List<TwoEntity>();
var threeEntityList = new List<ThreeEntity>();
sqlQuery = @"
BEGIN
MY_PACKAGE.GetMyItems(:id, :p_cursor1, :p_cursor2, :p_cursor3);
END;
";
oracleParameters = new List<OracleParameter>
{
new OracleParameter("p_id", id),
new OracleParameter("p_cursor1", OracleDbType.RefCursor, ParameterDirection.Output),
new OracleParameter("p_cursor2", OracleDbType.RefCursor, ParameterDirection.Output),
new OracleParameter("p_cursor3", OracleDbType.RefCursor, ParameterDirection.Output)
};
using (var connection = _dbContext.Database.Connection)
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = sqlQuery;
command.Parameters.AddRange(oracleParameters.ToArray());
using (var reader = command.ExecuteReader())
{
oneEntityList = ((IObjectContextAdapter)dbContext).ObjectContext
.Translate<OneEntity>(reader)
.ToList();
reader.NextResult();
twoEntityList = ((IObjectContextAdapter)dbContext).ObjectContext
.Translate<TwoEntity>(reader)
.ToList();
reader.NextResult();
threeEntityList = ((IObjectContextAdapter)dbContext).ObjectContext
.Translate<ThreeEntity>(reader)
.ToList();
}
return new MyItems { OneEntity = oneEntityList, TwoEntity = twoEntityList, ThreeEntity = threeEntityList };
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当你拥有一生时,using在一次性物品周围使用陈述是正确和恰当的 ; 但是,在这种情况下:你没有!这里的连接属于数据上下文,可能是数据上下文本身IDisposable,并且在处理数据上下文时它将配置连接.
因此:虽然您可能被允许从数据上下文中借用连接以执行查询 - 但您不应该尝试在此处置它.这将最终在意外时间关闭/处置连接,结果不可预测.
相反:如果你有一个var conn = new OracleConnection(...),那么显然你确实拥有了这个连接(除非你将它交给管理生命周期的东西),你应该处理它.
只是为了使事情进一步复杂化...目前,您MyClass似乎拥有db-context,通过:
private MyDbContext _dbContext = new MyDbContext();
Run Code Online (Sandbox Code Playgroud)
理想情况下,你MyClass应该是一次性的(: IDisposable),处理MyClass应该级联配置_dbContext.
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |