tables net mvc framework asp entity-framework asp.net-mvc-5 asp.net-identity ef-model-first asp.net-identity-2

entity framework - mvc - Modelo de identidad ASP.NET Primero falla debido a columnas AspNetUserRoles renombradas



oauth2 asp net mvc (1)

Si en el inicio y en la base de datos aún está vacío, creo que la solución más fácil es:

  1. Crear modelo EF (edmx).
  2. Haga clic derecho en el modelo "Generar base de datos del modelo".
  3. Creará el archivo DDL (fragmento a continuación)
  4. Reemplace todos los "AspNetUsers_Id" y "AspNetRoles_Id" incorrectos por los valores correctos.
  5. Haga clic derecho en "ejecutar".

    Funciona para mi. -- Creating non-clustered index for FOREIGN KEY ''FK_AspNetUserRoles_AspNetUser'' CREATE INDEX [IX_FK_AspNetUserRoles_AspNetUser] ON [dbo].[AspNetUserRoles] ([AspNetUsers_Id]); //replace for UserId

Feliz codificación!

Al igual que muchos otros, he intentado implementar primero el modelo de identidad ASP.NET. Todo funciona bien una vez que lo has intentado, cometido un error, fumaste, buscó y resolvió ... pensé.

Ver también:

Curso de acción, resumido:

  • Proyecto por defecto creado (MVC5)
  • Crear base de datos
  • Actualizar connectionstring en web.config
  • Ejecutar sitio web, registrarse: se crean tablas
  • Crear modelo EF (edmx)
  • Importar tablas de identidad (todo bien hasta este punto)
  • Modificado xxx.Context.tt para heredar de IdentityDbContext
  • Generar un script de base de datos (el problema comienza aquí)

He resuelto los problemas que aparecieron (hasta el último paso). Para completar, los describiré.

Usar el contexto de identidad predeterminado

Todo funciona bien: se crean tablas, puedo registrarme e iniciar sesión. Sin embargo, esta no es la situación que deseo: quiero usar un enfoque Model First.

Usando el primer contexto personalizado, modelo utilizando la conexión de EF

Modificar el CreatePerOwinContext para que use mi contexto Model First:

public void ConfigureAuth(IAppBuilder app) { app.CreatePerOwinContext(CustomModelFirstDbContext.Create);

Y ApplicationUserManager para que use el contexto Model First:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<CustomModelFirstDbContext>()));

Resultados en:

Error del servidor en la aplicación ''/''.

El tipo de entidad ApplicationUser no es parte del modelo para el contexto actual.

Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.InvalidOperationException: el tipo de entidad ApplicationUser no es parte del modelo para el contexto actual.

Error de fuente:

Se generó una excepción no controlada durante la ejecución de la solicitud web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de pila de excepción a continuación.

Stack Trace: [InvalidOperationException: el tipo de entidad ApplicationUser no es parte del modelo para el contexto actual.]

Usando la conexión de cadena "normal" con el contexto personalizado, Primer modelo

Se produjo una excepción del tipo ''System.Data.Entity.Infrastructure.UnintentionalCodeFirstException'' en WebApplication1.dll pero no se manejó en el código de usuario

Información adicional: el código generado con las plantillas T4 para Database First y Model First development puede no funcionar correctamente si se usa en el modo Code First. Para continuar utilizando Database First o Model First, asegúrese de que la cadena de conexión de Entity Framework esté especificada en el archivo de configuración de la aplicación en ejecución. Para utilizar estas clases, que se generaron desde Database First o Model First, con Code First agrega cualquier configuración adicional utilizando atributos o la API de DbModelBuilder y luego elimina el código que arroja esta excepción.

Por lo tanto, pensé que necesitaba el contexto de Identidad predeterminado para usar Identidad y usar el contexto personalizado Primero modelo para todo lo demás. No es la solución preferida, pero aceptable.

  • Rodó todo de vuelta
  • Importar tablas de identidad de la base de datos
  • (Opcional) Entidades creadas a través del enfoque Modelo Primero
  • Script generado de la base de datos

Tanto el proyecto normal como el proyecto de prueba de comprobación de cordura rápida tienen el mismo problema con la tabla AspNetUserRoles. Esa es una tabla de unión, y al importarla en el diseñador de EF, todo está bien. No lo verá, ya que se trata de una relación de muchos a muchos, y al inspeccionar la asociación entre AspNetRole y AspNetUser se ve bien.

Diseñador y detalles de mapeo:

Sin embargo, al generar el script sql, EF modifica las claves.

Diseñador y detalles de mapeo:

Script SQL generado:

-- Creating table ''AspNetUserRoles'' CREATE TABLE [dbo].[AspNetUserRoles] ( [AspNetRoles_Id] nvarchar(128) NOT NULL, [AspNetUsers_Id] nvarchar(128) NOT NULL ); GO

En EF, no puede cambiar los nombres de las asignaciones en el diseñador ( hilo en social.msdn.microsoft.com ).

Posteriormente, la creación de un nuevo usuario fallará, utilizando el contexto creado originalmente porque la tabla de unión contiene las columnas incorrectas:

Error del servidor en la aplicación ''/''.

Nombre de columna inválido ''UserId''.

Nombre de columna inválido ''UserId''.

Nombre de columna inválido ''UserId''.

Nombre de columna inválido ''RoleId''.

Nombre de columna inválido ''UserId''.

Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.Data.SqlClient.SqlException: nombre de columna inválido ''UserId''. Nombre de columna inválido ''UserId''. Nombre de columna inválido ''UserId''. Nombre de columna inválido ''RoleId''. Nombre de columna inválido ''UserId''.

Error de fuente:

Línea 89: {

Línea 90: var user = new ApplicationUser () {UserName = model.Email, Email = model.Email};

Línea 91: Resultado de IdentityResult = aguardar UserManager.CreateAsync (user, model.Password);

Línea 92: if (result.Succeeded)

Línea 93: {

¿Cuál es la solución? ¿Hay alguna alternativa más que intentar cambiar el guión generado o pasar a Code First?