Partage de la table Users entre un IdentityDbContext et une application principale DbContext

Mon application (embeddede dans MVC5 / EF6) doit utiliser une database unique avec deux schémas:

  • identité : pour stocker toutes les tables d'identité AspNet pour les users et les rôles.
  • application : Pour stocker toutes mes tables d'application générales.

Je souhaite utiliser un context DbContext distinct pour chaque schéma, avec l' identity créée avec la class d'assistance Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext<ApplicationUser> et l' application principale créée dans le code avec le code en premier. La raison d'avoir deux DbContexts comme ceci est que je peux mettre le context de l'application principale dans un assemblage séparé et l'utiliser dans d'autres projets connexes sans avoir à faire reference à Asp.Net.

Cependant, je veux referencer une table dans le schéma / context de l' application avec une key étrangère que je veux append à la table identity.AspNetUsers , avec d'autres champs supplémentaires. Je veux ensuite créer une entité Users dans le context principal qui correspond à la table identity.AspNetUsers .

Par exemple, je veux une application.Tenants Table des éléments dont identity.AspNetUsers a une key étrangère, afin que je puisse avoir plusieurs users appartenant à un seul locataire.

Tout va bien je pense et fonctionnera sans problèmes, sauf quand il s'agit de créer la database, et éventuellement toutes les migrations qui affectent cette table, car je vais avoir deux DbContext essayant de créer la même table.

Puis-je marquer une table dans OnModelCreating comme "ne pas créer", et si oui comment append la contrainte de key étrangère? Si non alors comment puis-je gérer cela? Je ne pense pas que ce que j'essaie de faire est déraisonnable. Je veux juste éviter d'avoir deux tables "Users" liées avec une key étrangère implicite (c'est-à-dire sans contrainte réelle de key étrangère).

    Pourquoi voulez-vous utiliser deux DbContext distincts? Il serait plus facile d'avoir un seul context pour datatables d'identité ASP.NET et vos entités commerciales:

     public class DatabaseContext : IdentityDbContext<UserInfo> { public virtual DbSet<Entity> Entities { get; set; } // Your business entities public DatabaseContext() : base("name=DatabaseContext") { } } 

    Notez que DatabaseContext hérite de IdentityDbContext<UserInfo> .

    Il y a quelques compromis avec cette approche: par exemple, votre couche d'access aux données doit referencer Microsoft.AspNet.Identity.Core et Microsoft.AspNet.Identity.EntityFramework ; Cependant, le fait d'avoir un seul context de database dans votre projet rend les choses beaucoup plus faciles si vous utilisez l'dependency injection ou les migrations d'Entity Framework.