ASP.NET 5, Entity Framework 7 y SQL Server 2014 - múltiples dbContexts, vistas SQL

asp.net-core dbcontext entity-framework-core sql-server-2014 visual-studio-2015

Pregunta

He creado una solución en Visual Studio 2015 que consiste en un proyecto web (utilizando la plantilla de vista previa de la aplicación web ASP.NET 5 Beta 6) y un proyecto de modelo (utilizando Entity Framework 7 Beta 6).

Llegué al punto en que podía obtener datos de una base de datos de SQL Server y mostrarlos en una página. Luego, quise intentar extraer datos de dos bases de datos diferentes, pero tuve problemas al intentar usar más de un dbContext.

En Startup.cs, agrego el servicio EF y agrego un dbContext, que funciona bien. Pero no estoy seguro de cómo agregar más de uno ... el código siguiente es cómo intenté agregar otro, pero el segundo AddDbContext parece que sobrescribe el primero.

También me encontré con otro problema relacionado con esto ... No pude obtener datos de una vista SQL. He confirmado que la vista contiene datos, pero cuando escribo un método WebAPI para obtener datos de esa vista, la respuesta no contiene nada. En proyectos anteriores que utilizaron EF6, no tuve problemas para modelar vistas y recuperar datos de ellos.

Para resumir mis preguntas:

  1. ¿Cómo configurar múltiples dbContexts en un proyecto web ASP.NET 5 usando EF7?
  2. ¿Cómo se modela una vista de SQL Server en EF7?

Startup.cs:

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    // Setup configuration sources.
    var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

// This method gets called by a runtime.
// Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
    // Register Entity Framework
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<MyContextA>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:AConnectionString"])
        )
        .AddDbContext<MyContextB>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:BConnectionString"])
        );

    services.AddMvc();
}

config.json

{
  "Data": {
    "DefaultConnection": {
      "AConnectionString": "data source=xxxxxxx;initial catalog=xxxxxxxx;Uid=xxxxxxxxx;Pwd=xxxxxx;",
      "BConnectionString": "data source=xxxxxxx;initial catalog=xxxxxxxx;Uid=xxxxxxxxx;Pwd=xxxxxx;"
    }
  },
  "EntityFramework": {
    "MyContextA": {
      "ConnectionStringKey": "Data:DefaultConnection:AConnectionString"
    },
    "MyContextB": {
      "ConnectionStringKey": "Data:DefaultConnection:BConnectionString"
    }
  }
}

MyContextA.cs

public class MyContextA : DbContext
{
    public MyContextA (DbContextOptions options) : base(options) { }
    public DbSet<Product> Product { get; set; }
    public DbSet<Some_View> Some_View { get; set; }
}

MyContextB.cs

public class MyContextB : DbContext
{
    public MyContextB (DbContextOptions options) : base(options) { }
    public DbSet<Customer> Customer { get; set; }
}

Product.cs

public class Product
{
    [Key]
    public int ID { get; set; }
    public int Name { get; set; }
}

Some_View.cs

public class Some_View
{
    public int SomeField { get; set; }
    public int AnotherField { get; set; }
}

TestController.cs

[Route("api/[controller]")]
public class TestController : Controller
{
    private readonly MyContextA _dbContext;

    // Constructor
    public TestController(MyContextA dbContext)
    {
        _dbContext = dbContext;
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<Some_View> Get()
    {
        var data = _dbContext.Some_View;
        return data;
    }
}

Puedo hacer que todo funcione con un dbContext y usar tablas regulares como Producto en el ejemplo anterior. Pero cuando trato de usar la vista no obtengo datos, y cuando uso varios contextos, el segundo contexto anula al primero.

Respuesta aceptada

En caso de que esto ayude a alguien, esto ya no es un problema con .NET Core y EF Core 1.0.0. A continuación se muestra cómo registré cada dbcontext en mi API Web Startup.cs.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddDbContext<Context1>(options => options.UseSqlServer(Configuration["ConnectionStrings:Connection1"]));
    services.AddDbContext<Context2>(options => options.UseSqlServer(Configuration["ConnectionStrings:Connection2"]));
    // ...
}

appsettings.DEVELOPMENT.json

{
  "ConnectionStrings": {
    "Connection1": "[connection string here]",
    "Connection2": "[connection string here]",
  }
}

Respuesta popular

Intente cambiar los constructores de sus DbContext s para que se vean así:

public MyContextA (DbContextOptions<MyContextA> options) : base(options) { }
public MyContextB (DbContextOptions<MyContextB> options) : base(options) { }

Intenta llamar a ToList()

return data.ToList();

Cada uno de estos puede ser errores que querrá archivar en los repositorios de EF y MVC .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué