asp.net User Profile: how do I add a field once the DB has Users?

1k views Asked by At

My App has been live for some time now so there are many users in the db and they already have profile data attached, I now need to add an extra field to the profile.

I added the new field to my web.config file:

<add name="DefaultToOK" type="System.Boolean" defaultValue="True" />

I updated all the relevant classes and methods to assign the variable:

// RegistrationData class    
...
[Display(Name = "DefaultToOKLabel", Description = "DefaultToOKDescription", ResourceType = typeof(RegistrationDataResources))]
public bool DefaultToOK { get; set; }
...

public void GetDataFromMembershipUser(MembershipUser user)
{
    WebProfile profile = WebProfile.GetProfile(user.UserName);

    ...
    if (profile.DefaultToOK != null)
        this.DefaultToOK = profile.DefaultToOK;
    ...
}

// similarly added elsewhere (User.cs, UserRegistrationService.cs and UserData POCO)

When I try to run and login, it comes back with an exception (understandably) as the field is not found in the profile data in the db:

System.ServiceModel.DomainServices.Client.DomainOperationException was unhandled by user code
  Message=Load operation failed for query 'Login'. 
  A profile property does not exist for DefaultsToOK. 
  InnerException message: The settings property 'DefaultsToOK' was not found.
  ErrorCode=500 
  ...

My question is: how do I add a new field to the asp_net profile without having an exception thrown?

EDIT: Web config

<profile defaultProvider="AspNetSqlProfileProvider" enabled="true">
  <providers>
    <clear />
    <add name="AspNetSqlProfileProvider" type="MyApp.Web.MySqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" />
  </providers>
  <properties>
    <add name="FriendlyName" />
    <add name="JobTitle" />
    <add name="TopLevelViewName" defaultValue="[ANY]" />
    <add name="TopLevelViewID" type="System.Guid" defaultValue="[null]" />
    <add name="RouteIDs" />
    <add name="TopLevelViewType" type="System.Int32" defaultValue="0" />
    <add name="PasswordQuestionAnswer" />
    <add name="Criticality" type="System.Int32" defaultValue="0" />
    <!-->add name="DefaultToOK" type="System.Boolean" defaultValue="True" /-->
  </properties>
</profile>

Web Profile

public partial class WebProfile {

        private System.Web.Profile.ProfileBase _profileBase;

        public WebProfile() {
            this._profileBase = new System.Web.Profile.ProfileBase();
        }

        public WebProfile(System.Web.Profile.ProfileBase profileBase) {
            this._profileBase = profileBase;
        }

        public virtual string RouteIDs {
            get {
                return ((string)(this.GetPropertyValue("RouteIDs")));
            }
            set {
                this.SetPropertyValue("RouteIDs", value);
            }
        }

        public virtual string PasswordQuestionAnswer {
            get {
                return ((string)(this.GetPropertyValue("PasswordQuestionAnswer")));
            }
            set {
                this.SetPropertyValue("PasswordQuestionAnswer", value);
            }
        }

        public virtual string JobTitle {
            get {
                return ((string)(this.GetPropertyValue("JobTitle")));
            }
            set {
                this.SetPropertyValue("JobTitle", value);
            }
        }

        public virtual int TopLevelViewType {
            get {
                return ((int)(this.GetPropertyValue("TopLevelViewType")));
            }
            set {
                this.SetPropertyValue("TopLevelViewType", value);
            }
        }

        public virtual string FriendlyName {
            get {
                return ((string)(this.GetPropertyValue("FriendlyName")));
            }
            set {
                this.SetPropertyValue("FriendlyName", value);
            }
        }

        public virtual string TopLevelViewName {
            get {
                return ((string)(this.GetPropertyValue("TopLevelViewName")));
            }
            set {
                this.SetPropertyValue("TopLevelViewName", value);
            }
        }

        public virtual int Criticality {
            get {
                return ((int)(this.GetPropertyValue("Criticality")));
            }
            set {
                this.SetPropertyValue("Criticality", value);
            }
        }

        public virtual System.Guid TopLevelViewID {
            get {
                return ((System.Guid)(this.GetPropertyValue("TopLevelViewID")));
            }
            set {
                this.SetPropertyValue("TopLevelViewID", value);
            }
        }

        public static WebProfile Current {
            get {
                return new WebProfile(System.Web.HttpContext.Current.Profile);
            }
        }

        public virtual System.Web.Profile.ProfileBase ProfileBase {
            get {
                return this._profileBase;
            }
        }

        public virtual object this[string propertyName] {
            get {
                return this._profileBase[propertyName];
            }
            set {
                this._profileBase[propertyName] = value;
            }
        }

        public virtual string UserName {
            get {
                return this._profileBase.UserName;
            }
        }

        public virtual bool IsAnonymous {
            get {
                return this._profileBase.IsAnonymous;
            }
        }

        public virtual bool IsDirty {
            get {
                return this._profileBase.IsDirty;
            }
        }

        public virtual System.DateTime LastActivityDate {
            get {
                return this._profileBase.LastActivityDate;
            }
        }

        public virtual System.DateTime LastUpdatedDate {
            get {
                return this._profileBase.LastUpdatedDate;
            }
        }

        public virtual System.Configuration.SettingsProviderCollection Providers {
            get {
                return this._profileBase.Providers;
            }
        }

        public virtual System.Configuration.SettingsPropertyValueCollection PropertyValues {
            get {
                return this._profileBase.PropertyValues;
            }
        }

        public virtual System.Configuration.SettingsContext Context {
            get {
                return this._profileBase.Context;
            }
        }

        public virtual bool IsSynchronized {
            get {
                return this._profileBase.IsSynchronized;
            }
        }

        public static System.Configuration.SettingsPropertyCollection Properties {
            get {
                return System.Web.Profile.ProfileBase.Properties;
            }
        }

        public static WebProfile GetProfile(string username) {
            return new WebProfile(System.Web.Profile.ProfileBase.Create(username));
        }

        public static WebProfile GetProfile(string username, bool authenticated) {
            return new WebProfile(System.Web.Profile.ProfileBase.Create(username, authenticated));
        }

        public virtual object GetPropertyValue(string propertyName) {
            return this._profileBase.GetPropertyValue(propertyName);
        }

        public virtual void SetPropertyValue(string propertyName, object propertyValue) {
            this._profileBase.SetPropertyValue(propertyName, propertyValue);
        }

        public virtual System.Web.Profile.ProfileGroupBase GetProfileGroup(string groupName) {
            return this._profileBase.GetProfileGroup(groupName);
        }

        public virtual void Initialize(string username, bool isAuthenticated) {
            this._profileBase.Initialize(username, isAuthenticated);
        }

        public virtual void Save() {
            this._profileBase.Save();
        }

        public virtual void Initialize(System.Configuration.SettingsContext context, System.Configuration.SettingsPropertyCollection properties, System.Configuration.SettingsProviderCollection providers) {
            this._profileBase.Initialize(context, properties, providers);
        }

        public static System.Configuration.SettingsBase Synchronized(System.Configuration.SettingsBase settingsBase) {
            return System.Web.Profile.ProfileBase.Synchronized(settingsBase);
        }

        public static System.Web.Profile.ProfileBase Create(string userName) {
            return System.Web.Profile.ProfileBase.Create(userName);
        }

        public static System.Web.Profile.ProfileBase Create(string userName, bool isAuthenticated) {
            return System.Web.Profile.ProfileBase.Create(userName, isAuthenticated);
        }
    }
1

There are 1 answers

0
msleep01 On BEST ANSWER

If you load your profile programmatically then modify the code below to set your values I believe it should do the trick:

var profile = ProfileBase.Create(username);
profile.SetPropertyValue("MyGuid", aGuid);
profile.SetPropertyValue("MyString", aString);
// etc
profile.Save()

ASP.NET Profiles - Add a profile to an existing user