tutorial tables net mvc español asp asp.net-mvc asp.net-identity

asp.net mvc - tables - Combinar MyDbContext con IdentityDbContext



asp.net identity tutorial español (7)

  1. Mueva la definición de ApplicationUser a su DAL.
  2. MyDbContext su MyDbContext de IdentityDbContext<ApplicationUser> o IdentityDbContext
  3. OnModelCreating - Proporciona la información de la clave externa.
  4. Pase MyDbContext mientras crea el UserManager<ApplicationUser>

Tengo un MyDbContext en un proyecto de biblioteca de clases de Data Accass Layer separado. Y tengo un proyecto ASP.NET MVC 5 con un IdentityDbContext predeterminado. Los dos contextos usan la misma base de datos, y quiero usar la tabla AspNetUsers como clave externa para algunas de mis tablas. Así que me gustaría fusionar los dos Contexto, y también quiero usar la Identidad ASP.NET.

¿Cómo puedo hacer esto?

Por favor aconséjame,

Este es mi contexto después de fusionar:

public class CrmContext : IdentityDbContext<CrmContext.ApplicationUser> //DbContext { public class ApplicationUser : IdentityUser { public Int16 Area { get; set; } public bool Holiday { get; set; } public bool CanBePublic { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } public CrmContext() : base("DefaultConnection") { } public DbSet<Case> Case { get; set; } public DbSet<CaseLog> CaseLog { get; set; } public DbSet<Comment> Comment { get; set; } public DbSet<Parameter> Parameter { get; set; } public DbSet<Sign> Sign { get; set; } public DbSet<Template> Template { get; set; } public DbSet<Read> Read { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } }

Aquí está mi clase RepositoryBase:

public class RepositoryBase<TContext, TEntity> : IRepositoryBaseAsync<TEntity>, IDisposable where TContext : IdentityDbContext<CrmContext.ApplicationUser> //DbContext where TEntity : class { private readonly TContext _context; private readonly IObjectSet<TEntity> _objectSet; protected TContext Context { get { return _context; } } public RepositoryBase(TContext context) { if (context != null) { _context = context; //Here it is the error: _objectSet = (_context as IObjectContextAdapter).ObjectContext.CreateObjectSet<TEntity>(); } else { throw new NullReferenceException("Context cannot be null"); } } }

Se produjo una excepción de tipo ''System.Data.Entity.ModelConfiguration.ModelValidationException'' en EntityFramework.dll pero no se manejó en el código de usuario

Información adicional : Se detectaron uno o más errores de validación durante la generación del modelo:

Actualización: he encontrado la solución.

Tuve que eliminar esta convención de nomenclatura:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); }

Y migre el modelo ef cf a db, para cambiar el nombre de mis tablas con las convenciones de nombres de identidad de asp.net. ¡Está trabajando ahora!


1) Después de heredar el contexto de IdentityDbContext, los errores relacionados con las claves primarias en las tablas de Identidad (AspNetUsers, etc.) deberían desaparecer.

2) A su extensión de ApplicationUser de IdentityUser le faltan las propiedades de navegación que Entity Framework interpreta como claves foráneas (también son muy útiles para la navegación desde su código).

public class ApplicationUser : IdentityUser { public Int16 Area { get; set; } public bool Holiday { get; set; } public bool CanBePublic { get; set; } public string FirstName { get; set; } public string LastName { get; set; } //*** Add the following for each table that relates to ApplicationUser (here 1-to-many) public virtual IList<Case> Cases { get; set; } //Navigation property //*** and inside the case class you should have //*** both a public ApplicationUser ApplicationUser {get;set;} //*** and a public string ApplicationUserId {get;set;} (string because they use GUID not int) }

3) Leí en muchos lugares que al anular OnModelCreating, tienes que llamar al método base. Parece que a veces se puede prescindir de ello.

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //.... }


El problema se debió a que sobrescribió el contenido del método "OnModelCreating", que se implementa en la clase IdentityUser.

Primero debe llamar al método OnModelCreating desde la clase base, y luego agregar su código. Entonces tu método OnModelCreating debería verse así:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); }


Este puede ser un hilo viejo, pero este artículo fue muy útil para demostrar cómo funciona la solución a la pregunta anterior: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx

Terminé teniendo que incluir

protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //.... }

Porque sin ella obtendría el siguiente error:

EntityType ''IdentityUserRole'' no tiene una clave definida. Define la clave para este tipo de entidad. EntityType ''IdentityUserLogin'' no tiene una clave definida. Define la clave para este tipo de entidad. EntitySet ''IdentityUserRoles'' se basa en el tipo ''IdentityUserRole'' que no tiene claves definidas. EntitySet ''IdentityUserLogins'' se basa en el tipo ''IdentityUserLogin'' que no tiene claves definidas.

Si agrego estas configuraciones como se mencionó anteriormente:

public class IdentityUserLoginConfiguration : EntityTypeConfiguration<IdentityUserLogin> { public IdentityUserLoginConfiguration() { HasKey(iul => iul.UserId); } } public class IdentityUserRoleConfiguration : EntityTypeConfiguration<IdentityUserRole> { public IdentityUserRoleConfiguration() { HasKey(iur => iur.RoleId); } }

crearía una clave externa adicional llamada Application_User.


He dado una respuesta completa a esta pregunta here . Aquí está la respuesta corta:

Basándonos en el código fuente de IdentityDbContext, si queremos fusionar IdentityDbContext con nuestro DbContext tenemos dos opciones:

Primera opción:
Cree un DbContext que herede de IdentityDbContext y tenga acceso a las clases.

public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection") { } static ApplicationDbContext() { Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer()); } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } // Add additional items here as needed }

Segunda Opción: (No recomendado)
En realidad, no tenemos que heredar de IdentityDbContext si escribimos todo el código nosotros mismos.
Así que básicamente podemos heredar de DbContext e implementar nuestra versión personalizada de "OnModelCreating (constructor de ModelBuilder)" del código fuente de IdentityDbContext


Intenté de una manera sencilla. Copie la cadena de conexión de su base de datos y reemplace la cadena de conexión de DefaultConnection. Continúe y cree un usuario, todas las tablas necesarias se crearán automáticamente en su base de datos.

Espero que ayude


Puede recibir el siguiente mensaje si sigue los pasos anteriores pero no puede encontrar la manera de proporcionar la información clave. El error que puede recibir es:

IdentityUserLogin:: EntityType ''IdentityUserLogin'' no tiene una clave definida. Define la clave para este tipo de entidad. Context.IdentityUserRole:: EntityType ''IdentityUserRole'' no tiene una clave definida. Define la clave para este tipo de entidad.

Crea las dos clases siguientes

public class IdentityUserLoginConfiguration : EntityTypeConfiguration<IdentityUserLogin> { public IdentityUserLoginConfiguration() { HasKey(iul => iul.UserId); } } public class IdentityUserRoleConfiguration : EntityTypeConfiguration<IdentityUserRole> { public IdentityUserRoleConfiguration() { HasKey(iur => iur.RoleId); } }

En el método OnModelCreating dentro de sus aplicaciones, DbContext agrega las dos configuraciones descritas anteriormente al modelo:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new IdentityUserLoginConfiguration()); modelBuilder.Configurations.Add(new IdentityUserRoleConfiguration()); }

Ahora debería deshacerse de los métodos de error cuando se está creando su modelo. Lo hizo por mí.