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);
}
}
If you load your profile programmatically then modify the code below to set your values I believe it should do the trick:
ASP.NET Profiles - Add a profile to an existing user