Red de conocimiento informático - Material del sitio web - Cómo actualizar IdentityUser con propiedades personalizadas usando MVC5 y Entity Framework

Cómo actualizar IdentityUser con propiedades personalizadas usando MVC5 y Entity Framework

Hay al menos otra consulta SO que ha intentado solucionar este problema. Pero la solución sugerida también rompe otras cosas:

1) Crear otra instancia de UserDbContext e intentar conectarse al objeto de usuario hace que Entity Framework se queje

"No se puede acceder a los objetos de entidad IEntityChangeTracker ¡Referencias de instancias múltiples "

2) Desactivar la creación de proxy resuelve el problema enumerado en el punto 1, pero hará que DbContext no pueda cargar objetos secundarios (como AspNetUserLogins, que es muy importante).

Otra solución es acceder al contexto creado por el controlador. Considere el AccountController predeterminado usando la plantilla constructora MVC (versión 5) para nuevas aplicaciones web ASP.NET:

PublicAccountController()

: Este (nuevo UserManagerLT; ApplicationUser) es un nuevo ASP Aplicación web .NET.GT; (nuevo UserStoreLT; ApplicationUserGT; (nuevo ApplicationDbContext ())))

{

} AccountController público (UserManagerLT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationUserGT; ApplicationContextDB; no se puede acceder a través de UserManager (porque la "Tienda" de UserManager es una propiedad privada).

Esto no parece ciencia espacial, así que supongo que lo que estoy haciendo tiene algo que ver con el manejo del ciclo de vida de DbContext, que es básicamente correcto/entendido.

Entonces: ¿Cómo accedo/uso correctamente DbContext para guardar y actualizar AspNetUsers, propiedades personalizadas relacionadas y objetos secundarios persistentes (como AspNetUserLogins)?

Modificar-------

Una cosa más que quiero...

Estoy actualizando la estructura del AccountController para que ya no sea ya Valor predeterminado:

public AccountController (UserManagerLT; ApplicationUserGT; UserManager)

{

UserManager = UserManager

}

Así:

public AccountController (UserManagerLT; ApplicationUserGT; UserManager)

{

userDbContext = new UserDbContext();

UserStoreLT; ApplicationUserGT; nuevo UserStoreLT; ApplicationUserGT ();

UserManagerLT; nuevo CustomUserValidatorLT; ; //UserManager = UserManager;

UserManager = Manager; }

Al intentar conectarse a DbContext. Entity.EntityState.Modified;

Espere a userDbContext.SaveChangesAsync();

}

Sin embargo, intentar actualizar el estado generará una excepción:

"El tipo de proxy generado por el tipo de capa de objeto 'xyz.Models.ApplicationUser' ya tiene una excepción. Esta situación ocurre cuando el mismo tipo de capa de objeto es asignado por dos o más modelos diferentes del AppDomain".

Esto no se ve bien….

Usando Microsoft.AspNet.Identity;

Usando System.Data.Entity's; espacio de nombres xyz.App .Models

{

/ /Puede agregar datos de perfil agregando más propiedades a sus usuarios de la clase ApplicationUser, visite /fwlink/?LinkID=317594 para obtener más información.

Público *** clase ApplicationUser: IdentityUser

{

Público *** cadena Nombre { get; grupo }

Público *** cadena Nombre { get }

Público *** cadena; Código postal { get; grupo }

Público *** cadena PasswordReport { get; grupo }

Público *** cadena PasswordResetToken { get; p> Public ****System.DateTime's ? UserIdentityAsync (de UserManager LT; ApplicationUser GT; manager)

p> {

// Tenga en cuenta que el tipo de autenticación debe ser el mismo as CookieAuthenticationOptions.AuthenticationType Coincidencia definida

VAR UserIdentity = esperar a manager.CreateIdentityAsync (esto, DefaultAuthenticationTypes.ApplicationCookie);

// Agrega el usuario personalizado declarado aquí

Devolver UserIdentity;

} public **** ApplicationUser(){}}

public *** class UserDbContext: IdentityDbContextLT; /p>

público *** UserDbContext()

: base ("Conexión predeterminada")

{ }

{ }}

}