2009-08-04 25 views
20

Tengo un sitio asp.net que utiliza el proveedor de membresía ASP.net. El ID de usuario rastrea cada comentario, entrada, etc. en el DB.cambio de nombre de usuario ASP.NET

Dado que MS no proporciona una forma de cambiar el nombre de usuario, he encontrado el userNAME en la tabla de "usuarios" en el DB y solo hay 1 lugar donde aparece el nombre de usuario.

Mi pregunta es,

¿Es seguro para proporcionar una página de "editar perfil", donde se permite al usuario editar su propio nombre de usuario. Por supuesto, manejaría este cambio en segundo plano al cambiar directamente el valor de "nombre de usuario" en el DB.

¿Hay algún inconveniente en esto? He creado y modificado algunas cuentas de prueba y parece estar bien, solo me pregunto si hay algún negativo conocido antes de ponerlo en producción.

+0

Deberíamos revisar el puño si existe alguna clave externa en http://stackoverflow.com/a/1374315/413032. Si no existe, deberíamos preguntar (: si alguien lo usó y no hay una clave. Entonces podemos actualizar al usuario y ver lo que será. –

Respuesta

14

El enlace de cptScarlet fue bueno, sin embargo, desprecio el uso de procedimientos almacenados si no es necesario y estoy a favor de Entity Framework siempre que sea posible. Esto es lo que hice para cambiar el nombre de usuario, el uso de EF 4.0 y .NET 4.0:

  1. proyecto clic derecho -> Agregar nuevo elemento -> ADO.NET Entity Data Model
  2. Darle un nombre propio, me eligió "MembershipModel.edmx" y haga clic en Agregar
  3. Seleccione Generar desde la base de datos y haga clic en Siguiente
  4. Añadir la conexión a la base de datos 'aspnetdb' (la base de datos de suscripción de ASP.NET)
  5. darle un nombre propio, he elegido "MembershipEntities"
  6. Haga clic en Siguiente
  7. perforar en las Tablas y seleccione aspnet_Users
  8. cambiar el modelo de espacio de nombres a MembershipModel
  9. Haga clic en Finalizar

Ahora puede agregar código para crear el contexto del objeto EF y modificar la base de datos:

public void ChangeUserName(string currentUserName, string newUserName) 
{ 
    using (var context = new MembershipEntities()) 
    { 
     // Get the membership record from the database 
     var currentUserNameLowered = currentUserName.ToLower(); 
     var membershipUser = context.aspnet_Users 
      .Where(u => u.LoweredUserName == currentUserNameLowered) 
      .FirstOrDefault(); 

     if (membershipUser != null) 
     { 
      // Ensure that the new user name is not already being used 
      string newUserNameLowered = newUserName.ToLower(); 
      if (!context.aspnet_Users.Any(u => u.LoweredUserName == newUserNameLowered)) 
      { 
       membershipUser.UserName = newUserName; 
       membershipUser.LoweredUserName = newUserNameLowered; 
       context.SaveChanges(); 
      } 
     } 
    } 
} 

Nota: No contabilicé las ID de la aplicación en mi código. Por lo general, solo tengo una aplicación que utiliza la base de datos de membresía de ASP.NET, por lo que si tiene varias aplicaciones, tendrá que dar cuenta de eso.