当用户有设定配置属性值的时候,Profile 就会向数据源中各数据表添加记录。若用户是第一次设置自定义属性的,会向 aspnet_Applications 表添加一些新记录,从名字就可以看出它是记录应用程序相关信息的,然后再向 aspnet_Users 表添加一条记录,从名字也可以看出它是记录用户信息的,然后再向 aspnet_Profile 表添加一条记录,用户的配置的属性值就存在在这表里面,普通类型(System.String)的值会存储在 PropertyValuesString 字段里,默认是以 XML 序列化格式存储的,复杂的用户自定义类型经二进制序列化后存储在 PropertyValuesBinary 字段里。当然,在定义自定义类型时就要指定其是可序列化的。这样一来,当用户在设定了自己的配置属性值后,就会操作以上三个表(或二个表)。
在默认情况下,当用户登录的时候,Profile 对象会读取与登录名相对应的 Profile 属性值,也就是说匿名用户的属性值与登录用户的属性值是不同的,同样说明在数据库表里是不同记录的,用户登录后,Profile 会在上面所说到的三个表中添加或检索与登录名对应的属性值。当用户关闭浏览器,在下一次打开网页时就会以匿名用户去搜索属性值,若用户在此之前删除过 IE 浏览器的 Cookies,那么此时登录网页将会以没有设定用户配置属性的状态显示,为什么会这样呢,因为一开始在有启用 Profile 功能的网站中,用户 Profile 是与一个随机生成的号码相关联的,该号码是根据每个用户唯一生成的,它保存在浏览器的 Cookies 中,当你清除了 Cookies,Profile 就会重新生成一个新的号码,并保存在 IE 的 Cookies 里,遗憾的是,aspnet_Users 表和 aspnet_Profile 表不会删除之前的记录。
那有没有办法在登录后把匿名用户的配置属性值迁移到登录用户去呢?答案是肯定的。可以利用 ProfileModule 类的 MigrateAnonymous事件完成该任务,该事件只能在 Global.asax 文件中进行处理。如:
// Global.asax
void Profile_MigrateAnonymous(Object s, ProfileMigrateEventArgs e)
{
ProfileCommon anonProfile = Profile.GetProfile(e.AnonymousID);
Profile.FavoriteColor = anonProfile.FavoriteColor;
// Clean up anonymous profile
ProfileManager.DeleteProfile(e.AnonymousID);
AnonymousIdentificationModule.ClearAnonymousIdentifier();
// Save profile
Profile.Save();
}
该示例演示在用户登录后将匿名用户的配置属性 FavoriteColor 的值赋给已登录用户的 FavoriteColor 配置属性。若在登录后有修改过 FavoriteColor 属性,在下在次登录时还会被匿名的属性值复盖。在用户注销后,由于原来的匿名用户配置已被清除,所以将处于没设定配置属性的状态,然后用户再修改配置属性,又会向 aspnet_Users 表和 aspnet_Profile 表各添加一条新记录了!
还有一点就是,虽然匿名用户的配置属性被消除,但在 aspnet_Users 表的记录却没被删除,而只是删除了 aspnet_Profile 表的。
最后,可以通过 ProfileManager 类来管理这些 Profile 或生成信息报表,如果你愿意也可以手工删除表里的记录,但要有个顺序:aspnet_Profile -> aspnet_Users -> aspnet_Applications。