ASP.NET 5, Entity Framework 7 e SQL Server 2014: più dbContexts, viste SQL

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

Domanda

Ho creato una soluzione in Visual Studio 2015 che consiste in un progetto Web (utilizzando il modello di anteprima dell'applicazione Web Beta 6 di ASP.NET 5) e un progetto Model (utilizzando Entity Framework 7 Beta 6).

Sono arrivato al punto in cui ho potuto ottenere dati da un database SQL Server e visualizzarlo su una pagina. Quindi, volevo provare a estrarre i dati da due database diversi, ma ho riscontrato problemi durante il tentativo di utilizzare più di un dbContext.

In Startup.cs, aggiungo il servizio EF e aggiungo un dbContext, che funziona bene. Ma non sono sicuro di come aggiungerne più di uno ... il codice seguente è il modo in cui ho tentato di aggiungerne un altro, ma il secondo AddDbContext sembra sovrascrivere il primo.

Ho anche incontrato un altro problema in qualche modo correlato a questo .. Non ero in grado di ottenere dati da una vista SQL. Ho confermato che la vista contiene dati, ma quando scrivo un metodo WebAPI per ottenere dati da quella vista, la risposta non contiene nulla. Nei precedenti progetti che utilizzavano EF6, non ho avuto problemi a modellare viste e recuperare dati da essi.

Per riassumere le mie domande:

  1. Come si impostano più dbContexts in un progetto Web ASP.NET 5 utilizzando EF7?
  2. Come si modella una vista di SQL Server in 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;
    }
}

Sono in grado di ottenere tutto per funzionare con un dbContext e utilizzando tabelle regolari come Prodotto nell'esempio sopra. Ma quando provo ad usare la vista non ottengo dati, e quando uso più contesti il ​​secondo contesto sovrascrive il primo.

Risposta accettata

Nel caso in cui questo aiuti qualcuno, questo non è più un problema con .NET Core ed EF Core 1.0.0. Quello che segue è come ho registrato ogni dbcontext nella mia 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]",
  }
}

Risposta popolare

Prova a cambiare i costruttori dei tuoi DbContext per assomigliare a questo:

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

Prova a chiamare ToList()

return data.ToList();

Ognuno di questi può essere un bug da archiviare nei repository EF e MVC .




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché