ASP.NET 5, Entity Framework 7 et SQL Server 2014 - plusieurs dbContexts, vues SQL

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

Question

J'ai créé une solution dans Visual Studio 2015 composée d'un projet Web (à l'aide du modèle de prévisualisation d'application Web ASP.NET 5 Bêta 6) et d'un projet de modèle (à l'aide d'Entity Framework 7 Bêta 6).

Je suis arrivé au point où je pouvais obtenir des données d'une base de données SQL Server et les afficher sur une page. Ensuite, je voulais essayer d'extraire des données de deux bases de données différentes, mais j'ai rencontré des problèmes lorsque j'essayais d'utiliser plus d'un dbContext.

Dans Startup.cs, j'ajoute le service EF et ajoute un dbContext, qui fonctionne bien. Mais je ne suis pas sûr de savoir comment ajouter plus d'un ... Le code ci-dessous est la façon dont j'ai essayé d'en ajouter un autre, mais le second AddDbContext semble simplement écraser le premier.

J'ai également rencontré un autre problème quelque peu lié à cela. Je ne pouvais pas obtenir de données à partir d'une vue SQL. J'ai confirmé que la vue contient des données, mais lorsque j'écris une méthode WebAPI pour obtenir des données à partir de cette vue, la réponse ne contient rien. Dans les projets antérieurs utilisant EF6, je n'ai eu aucun problème à modéliser des vues et à en extraire des données.

Pour résumer mes questions:

  1. Comment configurer plusieurs dbContexts dans un projet Web ASP.NET 5 à l'aide de EF7?
  2. Comment modélisez-vous une vue SQL Server dans 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; }
}

Produit.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;
    }
}

Je suis capable de tout faire fonctionner avec un seul dbContext et en utilisant des tables régulières telles que Product dans l'exemple ci-dessus. Mais lorsque j'essaie d'utiliser la vue, je ne reçois aucune donnée et lorsque j'utilise plusieurs contextes, le second contexte remplace le premier.

Réponse acceptée

Au cas où cela aiderait quelqu'un, ce n'est plus un problème avec .NET Core et EF Core 1.0.0. Voici comment j'ai enregistré chaque dbcontext dans mon 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]",
  }
}

Réponse populaire

Essayez de changer les constructeurs de vos DbContext pour qu’ils ressemblent à ceci:

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

Essayez d'appeler ToList()

return data.ToList();

Chacun de ces problèmes peut être un bogue que vous voudrez archiver sur les dépôts EF et MVC .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi