Heredar de MembershipUser - Asp.net/C#

Tengo una clase de cliente que hereda de MembershipUser.

Cuando cargo un objeto Cliente, quiero poder establecer todos los valores en la clase base fácilmente.

Intento declarar propiedades de Customer que ocultan propiedades de MembershipUser de solo lectura, como ProviderUserKey, y luego establezco esas propiedades, sin embargo, las propiedades de la clase base son nulas cuando necesito que se establezcan.

aquí está mi clase Customer.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Web;
using System.Web.Security;
using _FusioLibrary.Utilities;

namespace _CutMyCostsLibrary.BusinessObjects
{
   public class Customer : MembershipUser
   {
    #region Properties

    private Boolean active;
    public Boolean Active
    {
        get { return active; }
        set { active = value; }
    }

    private String address1;
    public String Address1
    {
        get { return address1; }
        set { address1 = value; }
    }

    private String address2;
    public String Address2
    {
        get { return address2; }
        set { address2 = value; }
    }

    private String companyName;
    public String CompanyName
    {
        get { return companyName; }
        set { companyName = value; }
    }

    private String county;
    public String County
    {
        get { return county; }
        set { county = value; }
    }

    private DateTime createDate;
    public DateTime CreateDate
    {
        get { return createDate; }
        set { createDate = value; }
    }

    private Int32 customerId;
    public Int32 CustomerId
    {
        get { return customerId; }
        set { customerId = value; }
    }

    private Boolean deleted;
    public Boolean Deleted
    {
        get { return deleted; }
        set { deleted = value; }
    }


    private String firstName;
    public String FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    private String lastName;
    public String LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    private String mobile;
    public String Mobile
    {
        get { return mobile; }
        set { mobile = value; }
    }

    private DateTime modifyDate;
    public DateTime ModifyDate
    {
        get { return modifyDate; }
        set { modifyDate = value; }
    }

    private String phone;
    public String Phone
    {
        get { return phone; }
        set { phone = value; }
    }

    private DateTime reminderEmailSentDate;
    public DateTime ReminderEmailSentDate
    {
        get { return reminderEmailSentDate; }
        set { reminderEmailSentDate = value; }
    }

    private String town;
    public String Town
    {
        get { return town; }
        set { town = value; }
    }

    private String userIdAspNet;
    public String UserIdAspNet
    {
        get { return userIdAspNet; }
        set { userIdAspNet = value; }
    }


    #endregion

    #region MembershipUser Properties Hiding 

    read only properties need to be writeable

    private DateTime creationDate;
    public DateTime CreationDate
    {
        get { return creationDate; }
        set { creationDate = value; }
    }

    private bool isLockedOut;
    public bool IsLockedOut
    {
        get { return isLockedOut; }
        set { isLockedOut = value; }
    }

    private bool isOnline;
    public bool IsOnline
    {
        get { return isOnline; }
        set { isOnline = value; }
    }

    private DateTime lastLockoutDate;
    public DateTime LastLockoutDate
    {
        get { return lastLockoutDate; }
        set { lastLockoutDate = value; }
    }

    private DateTime lastPasswordChangedDate;
    public DateTime LastPasswordChangedDate
    {
        get { return lastPasswordChangedDate; }
        set { lastPasswordChangedDate = value; }
    }

    private string passwordQuestion;
    public string PasswordQuestion
    {
        get { return passwordQuestion; }
        set { passwordQuestion = value; }
    }
    private string providerName;
    public string ProviderName
    {
        get { return providerName; }
        set { providerName = value; }
    }

    private object providerUserKey;
    public object ProviderUserKey
    {
        get { return providerUserKey; }
        set { providerUserKey = value; }
    }

    private string userName;
    public string UserName
    {
        get { return userName; }
        set { userName = value; }
    }


    #endregion


    #region Load

    public static Customer Load(IDataReader iDataReader) 
    {
        Customer oCustomer = new Customer();


        //populate the customer properties
        oCustomer.Active = DataReaderUtility.GetBool(iDataReader["Active"]);
        oCustomer.Address1 = DataReaderUtility.GetString(iDataReader["Address1"]);
        oCustomer.Address2 = DataReaderUtility.GetString(iDataReader["Address2"]);
        oCustomer.CompanyName = DataReaderUtility.GetString(iDataReader["CompanyName"]);
        oCustomer.County = DataReaderUtility.GetString(iDataReader["County"]);
        oCustomer.CreateDate = DataReaderUtility.GetDateTime(iDataReader["CreateDate"]);
        oCustomer.CustomerId = DataReaderUtility.GetInt(iDataReader["CustomerId"]);
        oCustomer.Deleted = DataReaderUtility.GetBool(iDataReader["Deleted"]);
        oCustomer.FirstName = DataReaderUtility.GetString(iDataReader["FirstName"]);
        oCustomer.LastName = DataReaderUtility.GetString(iDataReader["LastName"]);
        oCustomer.Mobile = DataReaderUtility.GetString(iDataReader["Mobile"]);
        oCustomer.ModifyDate = DataReaderUtility.GetDateTime(iDataReader["ModifyDate"]);
        oCustomer.Phone = DataReaderUtility.GetString(iDataReader["Phone"]);
        oCustomer.ReminderEmailSentDate = DataReaderUtility.GetDateTime(iDataReader["ReminderEmailSentDate"]);
        oCustomer.Town = DataReaderUtility.GetString(iDataReader["Town"]);
        oCustomer.UserIdAspNet = DataReaderUtility.GetString(iDataReader["UserIdAspNet"]);



        //populate the MembershipUser properties
        if(!string.IsNullOrEmpty(oCustomer.UserIdAspNet))
        {
           MembershipUser oMembershipUser  = Membership.GetUser(Guid.Parse(oCustomer.UserIdAspNet));


           oCustomer.Comment = oMembershipUser.Comment;
           oCustomer.CreationDate = oMembershipUser.CreationDate;
           oCustomer.Email = oMembershipUser.Email;
           oCustomer.IsApproved = oMembershipUser.IsApproved;
           oCustomer.IsLockedOut = oMembershipUser.IsLockedOut;
           oCustomer.IsOnline = oMembershipUser.IsOnline;
           oCustomer.LastActivityDate = oMembershipUser.LastActivityDate;
           oCustomer.LastLockoutDate = oMembershipUser.LastLockoutDate;
           oCustomer.LastLoginDate = oMembershipUser.LastLoginDate;
           oCustomer.LastPasswordChangedDate = oMembershipUser.LastPasswordChangedDate;
           oCustomer.PasswordQuestion = oMembershipUser.PasswordQuestion;
           oCustomer.ProviderName = oMembershipUser.ProviderName;
           oCustomer.ProviderUserKey = oMembershipUser.ProviderUserKey;
           oCustomer.UserName = oMembershipUser.UserName;

        }


        return oCustomer;

    }

    #endregion
 }
}

Ahora, cuando intento ejecutar el siguiente código, aparece un error porque la clase base ProviderUserKey es nula.

                    Customer oCustomer = CustomerManager.GetCustomer(UrlUtility.GetStringValue("UserId"));



                    //first we need to update the username                                    
                    CustomerManager.UpdateCustomerUserName(oCustomer.UserIdAspNet, this.txtEmail.Text);

                    //Insert the modified data into the object

                    oCustomer.Active = this.cbActive.Checked;
                    oCustomer.Address1 = this.txtAddress1.Text;
                    oCustomer.Address2 = this.txtAddress2.Text;
                    oCustomer.CompanyName = this.txtCompanyName.Text;
                    oCustomer.County = this.txtCounty.Text;
                    oCustomer.FirstName = this.txtFirstName.Text;
                    oCustomer.LastName = this.txtLastName.Text;
                    oCustomer.Mobile = this.txtMobile.Text;
                    oCustomer.ModifyDate = DateTime.Now;
                    oCustomer.Phone = this.txtPhone.Text;
                    oCustomer.Town = this.txtTown.Text;
                    oCustomer.Email = this.txtEmail.Text;

                    //Update The Customer table
                    CustomerManager.UpdateCustomer(oCustomer);

                    //update the membership tables
                    Membership.UpdateUser(oCustomer);

tiene errores en la última línea Membership.UpdateUser (oCustomer) porque ProviderUserKey en la clase base es nula.

¿Alguna idea de cómo completar la clase base, teniendo en cuenta que ProviderUserKey es de solo lectura?

Las muestras de código (mi código modificado) serían realmente útiles y apreciadas.

preguntado el 16 de mayo de 11 a las 17:05

1 Respuestas

No puedes. Readonly significa que no puede configurarlo, solo puede leer su valor.

La única forma de conseguir una población adecuada MembershipUser que puedes actualizar es a través de Membership.GetUser, que devolverá una instancia del valor predeterminado MembershipUser class, no una instancia de su clase personalizada. Para hacer lo que está intentando hacer, deberá crear una MembershipProvider eso devuelve un Customer en lugar de un MemberhipUser, pero probablemente sea más un problema de lo que vale la pena. Lo que he descubierto que funciona mucho mejor es hacer Customer "envoltura" MembershipUser en lugar de extenderlo. Lo he hecho en ambos sentidos (creando un MembershipProvider y creando una envoltura alrededor MembershipUser), y usar un contenedor es definitivamente el enfoque más fácil:

public class Customer : MembershipUser
{
    #region Properties

    private MembershipUser _user;

    ....

    #region Load

    public static Customer Load(IDataReader iDataReader) 
    {
        Customer oCustomer = new Customer();
        ...

        if(!string.IsNullOrEmpty(oCustomer.UserIdAspNet))
        {
            oCustomer._user = Membership.GetUser(Guid.Parse(oCustomer.UserIdAspNet));
        }

        return oCustomer;
    }
}

Luego, en lugar de ocultar las propiedades de solo lectura, haga algo con ellas. Cambio de cliente. true a false significa que algo debe suceder, así que en tu Customer.IsLockedOut propiedad, en lugar de simplemente almacenar un valor que no significa nada, llame MembershipUser.UnlockUser():

public bool IsLockedOut
{
    get
    {
        return _user.IsLockedOut;
    }
    set
    {
        if(value != _user.IsLockedOut)
        {
            if(value)
            {
                // There's no way to programatically lock out a user, so either throw an InvalidOperationException or ignore it
            }
            else
            {
                _user.UnlockUser();
            }
        }
    }
}

Si no desea que se ejecute cuando establezca la propiedad, deberá realizar un seguimiento de si el valor cambió y llamar UnlockUser() a partir de su CustomerManager.UpdateCustomer método.

contestado el 16 de mayo de 11 a las 23:05

Gracias @Joel C, esta es la solución que estaba buscando. Me brinda toda la funcionalidad que necesito en este caso y no tengo que pasar el tiempo necesario para crear un MembershipProvider personalizado. Salud. - Frawls

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.