web-dev-qa-db-fra.com

Entity Framework Core utilisant plusieurs DbContexts

J'ai un problème lorsque j'essaie d'accéder à un champ de mon PartsDbContext et d'obtenir l'erreur suivante:

System.Data.SqlClient.SqlException: 'Nom d'objet non valide' NomChamp ''

Il semble que cela s’explique par le fait que j’essaie de faire en sorte que mon PartsDbContext utilise la même base de données que mon ApplicationDbContext qui est utilisé avec Identity. J'ai besoin de savoir comment configurer un deuxième dbcontext pour fonctionner avec le noyau EF qui utilise/crée une base de données différente.

J'ai essayé de créer une deuxième chaîne de connexion, mais cela m'apporte l'erreur suivante:

System.Data.SqlClient.SqlException: 'Impossible d'ouvrir la base de données "PartsDb" demandée par le login. La connexion a échoué. Échec de la connexion pour l'utilisateur 'DESKTOP-4VPU567\higle'. '

Voici mon code:

appsettings.json

"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true",
    "PartsConnection":  "Server=(localdb)\\mssqllocaldb;Database=PartsDb"
},
"Logging": {
    "IncludeScopes": false,
    "LogLevel": {
        "Default": "Warning"
    }
}

PartsDbContext.cs

public class PartsDbContext : DbContext
{
    public DbSet<PartsViewModels.Tower> Towers { get; set; }
    public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; }

    public PartsDbContext(DbContextOptions<PartsDbContext> options)
        : base(options)
    {
    }
}

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddEntityFramework()
        .AddDbContext<PartsDbContext>(options =>
          options.UseSqlServer(Configuration.GetConnectionString("PartsConnection")));

    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
    });

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
}

AdminController.cs

[Authorize(Policy = "RequireAdminRole")]
public class AdminController : Controller
{
    private readonly PartsDbContext _context;

    public AdminController(PartsDbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Towers()
    {
        var model = _context.Towers.ToList();
        return View(model);
    }
}

La ligne var model = _context.Towers.ToList(); est l'endroit où l'erreur apparaît.

Encore une fois. Je souhaite configurer mon PartsDbContext pour qu'il fonctionne avec Entity Framework Core de manière à ce que EF-Core crée automatiquement la base de données.

20
Joe Higley

Je l'ai compris. Cela est principalement dû au fait que j'ai accidentellement supprimé la base de données utilisée par Identity et que je devais trouver le moyen de la récupérer.

Apparemment, ma chaîne de connexion n’a rien d’inconvénient. Je devais simplement aller dans le gestionnaire de paquets et taper ces commandes dans cet ordre:

  1. Add-Migration init -Context PartsDbContext
  2. Update-Database -Context PartsDbContext

J'ai découvert cela parce que c'est ce que je devais faire pour que mon ApplicationDbContext fonctionne à nouveau et il s'avère que cette étape est effectuée pour vous lorsque vous créez une nouvelle application Web principale MVC dans Visual Studio à l'aide de l'authentification d'utilisateur individuel.

Donc, en gros, pour ajouter plus de DbContexts, vous devez:

  1. Créer une classe DbContext
  2. Créez une chaîne de connexion pour ce DbContext dans appsettings.json
  3. Ajoutez le DbContext à vos services configurés dans Startup.cs
  4. Configurez le DbContext dans les contrôleurs qui l’utiliseront.
  5. Ouvrez le gestionnaire de paquets et exécutez les 2 lignes ci-dessus. (si "-Context" ne fonctionne pas, essayez "--context"
  6. Exécutez votre programme et laissez EntityFrameworkCore s'occuper du reste.
22
Joe Higley