我正在使用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");
}
}
答案 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 ,它可以正常工作。