“由于DbContext已被处理”#2,因此无法完成操作

时间:2015-05-27 16:02:53

标签: c# asp.net entity-framework

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

enter image description here

嗯,我之前尝试解决这个问题,然后在这里发布。但我不能。我的控制器代码如下。

 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");
    }
}

2 个答案:

答案 0 :(得分:3)

您正在返回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");
    }
}

答案 1 :(得分:1)

解决了问题。我在Database.SetInitializer中写了 CreateDatabaseIfNotExists 而不是 DropCreateDatabaseAlways ,它可以正常工作。