【问题标题】:"The operation cannot be completed because the DbContext has been disposed" #2“操作无法完成,因为 DbContext 已被释放”#2
【发布时间】:2015-08-09 20:16:48
【问题描述】:

我正在使用 EF 和 Oracle 数据库构建一个简单的 ASP.NET API。当我想从数据库表中获取所有元素时,响应 (500) 会显示“操作无法完成,因为 DbContext 已被释放”。

好吧,我已经尝试过解决这个问题,然后才将它发布到这里。但我不能。我的控制器代码如下。

 public class PruebasController : ApiController
 {

    //Prueba[] pruebas = new Prueba[] 
    //{ 
    //    new Prueba { Name = "Tomato Soup"}, 
    //    new Prueba { Name = "Yo-yo"}, 
    //    new Prueba { Name = "Hammer"} 
    //};

    public IQueryable<Prueba> GetAllPruebas()
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<OracleDbContext>());

        using (var ctx = new OracleDbContext())
        {
            return ctx.Pruebas;
        }
    }
}

(如您所见,我有一个“pruebas”列表,当我返回它时,http 服务可以正常工作)

这是我的 OracleDbContext

public class OracleDbContext : DbContext
{

    public DbSet<Prueba> Pruebas { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("DATA");
    }
}

【问题讨论】:

  • 正如 Brino 在他的回答中提到的那样。或者,您可以在控制器中实例化您的上下文(可能在启动期间)并在处置您的控制器时处置它。这样,您可以继续使用当前的构造,而不必回退到 ToList oid。

标签: c# asp.net entity-framework


【解决方案1】:

您正在返回一个IQueryable 对象。返回后,您将退出您的 Using 语句,该语句将关闭您的 Context。在退出 using 语句之前,您需要使用 .ToList() 枚举。这将在上下文仍然打开时执行查询。

改成这样:

public List<Prueba> GetAllPruebas()
{
   using (var ctx = new OracleDbContext())
    {
        return ctx.Pruebas.ToList();
    }
}

此外,您应该在上下文的构造函数中添加初始化程序,而不是 GetAllPruebas 方法,如下所示:

public class OracleDbContext : DbContext
{
    public OracleDbContext()
    {
        Database.SetInitializer<OracleDbContext>(new DropCreateDatabaseAlways<OracleDbContext>());
    }

    public DbSet<Prueba> Pruebas { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("DATA");
    }
}

【讨论】:

  • 我只是提出你的建议,但错误仍然存​​在。
  • 请向我们展示引发错误的代码行。
  • 当我使用 toList() 而不是 AsEnumerable() 时,错误会发生变化。 DropCreateDatabaseAlways 初始化程序没有删除或创建数据库支持上下文“OracleDbContext”,因为为上下文启用了迁移。使用迁移来管理此上下文的数据库,例如通过从包管理器控制台运行“更新数据库”命令。
  • 我认为这是一个“上下文”问题,我只是写了一个插入语句,当我将对象“pruebas”添加到上下文对象时,它会抛出这个错误:“DropCreateDatabaseAlways 初始化程序没有删除或创建数据库支持上下文'OracleDbContext',因为为上下文启用了迁移。使用迁移......"
  • 正确,它无法初始化你的数据库,所以没有什么可以创建上下文。
【解决方案2】:

问题已解决。我在 Database.SetInitializer 中写了 CreateDatabaseIfNotExists 而不是 DropCreateDatabaseAlways 并且它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多