Una aplicación MVC 5 predeterminada viene con este código en IdentityModels.cs: este código es para todas las operaciones de identidad ASP.NET para las plantillas predeterminadas:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Si andamio un nuevo controlador usando vistas con Entity Framework y creo un "Nuevo contexto de datos ..." en el diálogo, obtengo esto generado por mí:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
}
}
Si andamio otra vista de controlador + usando EF, por ejemplo, para un modelo Animal, esta nueva línea se generaría automáticamente justo debajo public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
, como esta:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }
}
}
ApplicationDbContext
(para todas las cosas de identidad de ASP.NET) hereda de la IdentityDbContext
que a su vez hereda DbContext
.
AllOtherStuffDbContext
(para mis propias cosas) hereda de DbContext
.
Entonces mi pregunta es:
¿Cuál de estos dos ( ApplicationDbContext
y AllOtherStuffDbContext
) debo usar para todos mis otros modelos propios? ¿O debería usar el autogenerado predeterminado ApplicationDbContext
ya que no debería ser un problema usarlo ya que deriva de la clase base DbContext
, o habrá alguna sobrecarga? Debería usar solo un DbContext
objeto en su aplicación para todos sus modelos (lo he leído en alguna parte), ¿así que ni siquiera debería considerar usar ambos ApplicationDbContext
y AllOtherStuffDbContext
en una sola aplicación? ¿O cuál es la mejor práctica en MVC 5 con ASP.NET Identity?
fuente
Respuestas:
Usaría una sola clase de contexto que hereda de IdentityDbContext. De esta manera, puede tener el contexto al tanto de cualquier relación entre sus clases y el IdentityUser y Roles del IdentityDbContext. Hay muy poca sobrecarga en el IdentityDbContext, es básicamente un DbContext normal con dos DbSets. Uno para los usuarios y otro para los roles.
fuente
Existe mucha confusión sobre IdentityDbContext , una búsqueda rápida en Stackoverflow y encontrará estas preguntas:
" ¿Por qué Asp.Net Identity IdentityDbContext es un recuadro negro?
¿Cómo puedo cambiar los nombres de las tablas cuando uso Visual Studio 2013 AspNet Identity?
Fusionar MyDbContext con IdentityDbContext "
Para responder a todas estas preguntas, debemos entender que IdentityDbContext es solo una clase heredada de DbContext.
Echemos un vistazo a la fuente IdentityDbContext :
Según el código fuente, si queremos fusionar IdentityDbContext con nuestro DbContext, tenemos dos opciones:
Primera opción:
crear un DbContext que herede de IdentityDbContext y tener acceso a las clases.
Notas adicionales:
1) También podemos cambiar los nombres de tabla predeterminados de asp.net Identity con la siguiente solución:
2) Además, podemos extender cada clase y agregar cualquier propiedad a clases como 'IdentityUser', 'IdentityRole', ...
Para ahorrar tiempo, podemos usar la plantilla de proyecto extensible AspNet Identity 2.0 para extender todas las clases.
Segunda opción:(No recomendado)
En realidad, no tenemos que heredar de IdentityDbContext si escribimos todo el código nosotros mismos.
Básicamente, podemos simplemente heredar de DbContext e implementar nuestra versión personalizada de "OnModelCreating (ModelBuilder Builder)" del código fuente IdentityDbContext
fuente
Esta es una entrada tardía para la gente, pero a continuación está mi implementación. También notará que eliminé la capacidad de cambiar el tipo predeterminado de CLAVES: los detalles sobre los cuales se pueden encontrar en los siguientes artículos:
NOTAS:
Debe tenerse en cuenta que no puede usar
Guid's
sus llaves. Esto se debe a que bajo el capó son unStruct
, y como tal, no tienen un unboxing que permita su conversión de un<TKey>
parámetro genérico .Las clases se ven como:
fuente
Si profundiza en las abstracciones de IdentityDbContext, encontrará que se parece a su DbContext derivado. La ruta más fácil es la respuesta de Olav, pero si desea más control sobre lo que se está creando y un poco menos de dependencia de los paquetes de Identidad, eche un vistazo a mi pregunta y responda aquí . Hay un ejemplo de código si sigue el enlace, pero en resumen solo agrega los DbSets requeridos a su propia subclase DbContext.
fuente