asp.net - net - identity owin
MVC3 obtiene un Id de otra tabla cuando tengo Membership.GetUser(). ProviderUserKey (1)
Buscar busca una tabla basada en su clave principal, que en su caso es una int y no está relacionada con la Clave del proveedor de membresía (que es un guid). Entonces no puedes usar Buscar.
En su lugar, use una consulta Linq, como esta:
Profile profile = db.Profiles.Where(x => x.AspMembershipUserID == currentUser).FirstOrDefault();
Soy relativamente nuevo en el mundo de MVC y estoy desarrollando una aplicación MVC3, C # .Net, EF4 que utiliza el proveedor de membresía predeterminado de Microsoft. Existen requisitos para agregar algunos campos adicionales a las tablas del proveedor de membresía, que ayudan a conformar un perfil extendido para cada usuario. (La tabla que contiene esta información se llama Perfil, y tiene un PK de ProfileId INT y también contiene un FK del UserId de aspnet_Users / aspnet_Membership).
Quiero ofrecer a los nuevos usuarios la oportunidad de completar de inmediato su perfil después del registro, por lo que los redirijo a una página en la que pueden ingresar los valores que queremos para la tabla de perfil de inmediato. El registro funciona bien. Se crea el usuario, como es el registro de perfil en la base de datos.
Donde las cosas van mal es cuando llevo al usuario a esa página de edición de Perfil y trato de extraer sus datos. Voy a System.Web.Security.Membership.GetUser (). ProviderUserKey para obtener UserId, y luego encontrar su registro de perfil basado en eso.
Esto funcionó, y pensé que lo había resuelto, pero debo haber cometido un error en alguna parte y ahora no puedo hacerlo funcionar correctamente. El mensaje de error es bastante genérico y parece indicar que no puede encontrar el valor INT de ProfileId utilizando el valor GUID del UserId.
// GET: /Profile/Entry/
public ActionResult Entry()
{
Guid currentUser = (Guid)System.Web.Security.Membership.GetUser().ProviderUserKey;
Profile profile = db.Profiles.Find(currentUser);
ViewBag.UserId = new SelectList(db.aspnet_Users, "UserId", "UserName", profile.UserId);
return View(profile);
}
Ahora el mensaje de error:
Server Error in ''/'' Application.
--------------------------------------------------------------------------------
The argument types ''Edm.Int32'' and ''Edm.Guid'' are incompatible for this operation. Near WHERE predicate, line 1, column 76.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.EntitySqlException: The argument types ''Edm.Int32'' and ''Edm.Guid'' are incompatible for this operation. Near WHERE predicate, line 1, column 76.
Source Error:
Line 127: {
Line 128: Guid currentUser = ( Guid)System.Web.Security.Membership.GetUser().ProviderUserKey;
Line 129: Profile profile = db.Profiles.Find(currentUser);
Line 130: ViewBag.UserId = new SelectList(db.aspnet_Users, "UserId", "UserName", profile.UserId);
Line 131: return View(profile);
¿Alguna idea sobre cómo db.Profiles.Find (currentUser) se puede orientar específicamente para encontrar el valor GUID UserId aunque la columna Id predeterminada / asumida sea ProfileId INT?