c# - usar - Mover el modelo de identidad ASP.NET a la biblioteca de clase
programa en c# para una biblioteca (5)
¿Qué quieres decir con mover Identity a una biblioteca de clases? para ser utilizado como referencia? Tengo mi administrador de usuarios y usuario personalizados en una biblioteca separada, pero eso es todo.
La identidad requiere un almacén de datos de algún tipo. Si configura Identity para usar EF, asegúrese de obtener el paquete Nuget adicional para él, y debería poder pasar la cadena de conexión cuando cree el contexto.
La parte superior de mi cabeza...
var mgr = new UserManager<ApplicationUser>(
new IUserStore_ofYourChoice<ApplicationUser>(
new DbContextName("ConnectionStringOverload"));
Creo que la tienda EF es "UserStore", tengo que verificar.
Hay casi una docena de paquetes nuget diferentes para las áreas de almacenamiento de datos para Identity ahora. No tiene que usar EF, pero requiere una tienda de algún tipo.
** EDIT **
Además, como referencia siempre usará la configuración, y por lo tanto sus cadenas de conexión definidas, del proyecto principal de manera predeterminada, así es como se supone que debe funcionar, entonces eso está bien.
Estoy intentando mover el modelo de Identidad a una biblioteca de clase usando los métodos en este enlace:
Problema 1: parece seguir usando la cadena de conexión del proyecto del sitio web. Lo superé especificando la cadena de conexión completa en la biblioteca de la clase. ¿Puedo hacer que IdentityDbContext use la cadena de conexión de la biblioteca de clase?
Problema 2: debido al problema 1, si elimino el marco de la entidad del proyecto del sitio web. Le dará el siguiente error que está buscando SqlClient de EF en el proyecto del sitio web.
Se produjo una excepción del tipo ''System.InvalidOperationException'' en EntityFramework.dll pero no se manejó en el código de usuario
Información adicional: no se encontró ningún proveedor de Entity Framework para el proveedor ADO.NET con el nombre invariable ''System.Data.SqlClient''. Asegúrese de que el proveedor esté registrado en la sección ''entityFramework'' del archivo de configuración de la aplicación. Consulte http://go.microsoft.com/fwlink/?LinkId=260882 para obtener más información.
Se aceptan otras soluciones siempre que omita todas las referencias de la capa de acceso a datos como EF en el proyecto del sitio web.
Hay algunas reglas que debes conocer y recordar.
Primero, el proyecto web usará SIEMPRE y ÚNICAMENTE los archivos web.config que encuentre en su propio proyecto: punto. No importa lo que coloque en cualquier otro archivo de configuración en otro lugar en su solución. El proyecto web SÓLO puede usar lo que encuentre en su propio proyecto. Si tiene una cadena de conexión en otro proyecto, debe replicarla en el proyecto web, de lo contrario, nunca se encontrará.
En segundo lugar, suponiendo que el proyecto web es su proyecto de inicio, y suponiendo que está utilizando migraciones de datos (ya que Identity lo usa), tenga en cuenta que el administrador de paquetes SIEMPRE usará la cadena de conexión que encuentre en el proyecto de inicio. Por lo tanto, el administrador de paquetes, para la base de datos de actualización, no usará la cadena de conexión en su proyecto modelo.
La solución simple es: 1. Copie la cadena de conexión de su proyecto modelo a su proyecto web. 2. En la consola del administrador de paquetes, asegúrese de que el menú desplegable para seleccionar el contexto apunta a su proyecto modelo.
Para mover IdentityModel a una biblioteca de clases (que es lo que se debe hacer de acuerdo con el SRP ), siga estos pasos:
- Crea una biblioteca de clase. (ClassLibrary1)
- Usando NuGet, agregue una referencia a Microsoft.AspNet.Identity.EntityFramework. Esto también agregará automáticamente algunas otras referencias.
- Agregue una referencia en su sitio web a ClassLibrary1
- Busque WebSite / Models / IdentityModel.cs y muévalo a ClassLibrary1.
Haga que IdentityModel.cs se vea así:
public class ApplicationUser : IdentityUser { } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("YourContextName") { } }
Asegúrese de que Web.config de su sitio web tenga YourContextName apuntando a la base de datos correcta en la sección. (Nota: esta base de datos puede y debe albergar los datos de su aplicación).
<add name="YourContextName" connectionString="YourConnectionStringGoesHere" providerName="System.Data.SqlClient" />
Haga que su clase EF Context herede de su ApplicationDbContext:
public class YourContextName : ApplicationDbContext { public DbSet<ABizClass1> BizClass1 { get; set; } public DbSet<ABizClass2> BizClass2 { get; set; } // And so forth ... }
Cuando alguien en su sitio intente iniciar sesión o registrarse, el sistema de Identidad los encaminará a su base de datos con todos sus datos, que incluyen las tablas de Identidad.
¡Bueno para ir!
Pregunta 1:-
Supongo que puede usar la solución que se encuentra en el siguiente enlace:
Marco de entidad de instalación para cadena de conexión dinámica
Pregunta 2:-
Creo que el marco de la entidad se construye de la manera que cuando el tiempo de ejecución usará el web.config de ese proyecto. La instrucción de Microsoft también sugiere que
http://msdn.microsoft.com/en-us/library/vstudio/cc716677(v=vs.100).aspx
Una actualización de la respuesta de @ Rap para EF6 e Identity 2.0:
- Crea una biblioteca de clase. (ClassLibrary1)
- Usando NuGet, agregue una referencia a Microsoft.AspNet.Identity.EntityFramework y Microsoft.AspNet.Identity.Owin.
- Agregue una referencia en su sitio web a ClassLibrary1
- Busque WebSite / Models / IdentityModel.cs y muévalo a ClassLibrary1.
IdentityModel.cs debería verse así, sin necesidad de cambiar nada:
public class ApplicationUser : IdentityUser { public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); // Add custom user claims here return userIdentity; } } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) { } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } }
Asegúrese de que Web.config de su sitio web tenga un contexto que apunte a la base de datos correcta en la sección. (Nota: esta base de datos puede y debe albergar los datos de su aplicación).
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" /> </connectionStrings>
Haga que su clase EF Context herede de su ApplicationDbContext:
public class YourContextName : ApplicationDbContext { public DbSet<ABizClass1> BizClass1 { get; set; } public DbSet<ABizClass2> BizClass2 { get; set; } // And so forth ... }