一、ASP.NET四大“插件”的总后台--ASPNETDB (数据库关系图、表和视图 基本表和独立表)

(1). 数据库关系图、表和视图(1)  基本表和独立表


  安装数据库:aspnet_regsql 

 

  ASPNETDB 这个隐藏在ASP.NET 2.0四大“插件”
  (
     SqlMembershipProvider、
     SqlRoleProvider、
     SqlProfileProvider、
     SqlPersonalizationProvider
    )
    之后,时不时在你App_Data目录下幽灵般出现的SQL数据库,其实也并没什么神奇之处,
    我等凡夫俗子进去一看,原来也不过如此。不过如果我们要编写自定义Provider的话,
    还是得仔细研究一下下的,因为这4个Provider大部分的业务逻辑还是“封装”在这个数据库里的。
    下面,就容我这个老小弟,为各位兄弟理出里面的表、视图和存储过程。
    
    注:其实还有SqlWebEventProvider,它用到表aspnet_WebEvent_Events和存储过程aspnet_WebEvent_LogEvent。
    因为老小弟认为从性能上考虑,写入本地文件是更好的选择,所以在此不作介绍。
    另外,还有个和ASPNETDB无关的SiteMapProvider,主要配合SiteMapPath 等控件,一般以Xml文件形式存放站点地图。

    看张“地图”先:

    数据库关系图
aspnetdb Diagram
   这张图还是蛮重要的,兄弟们在看后面的内容时,还是要常回来看看,回来看看。
  
      
     在ASPNETDB数据库的几个表中,都有名称为Lowered***的字段,
     这些字段用来存放***字符串字段的小写形式副本。
     因为这些***字符串字段的比较都是不区分大小写,在表中存放一个小写形式副本,
     能提高字符串比较的速度。
   
     基本表 aspnet_Application、aspnet_Users
  1. 应用程序表
    aspnetdb Diagram

    每个Provider都有一个ApplicationName属性,该属性一般定义在web.config中。
    举一个ProfileProvider的例子(其余3个Provider也一样):

    <system.web>
      ...
      <connectionStrings>
        <add name="SqlSrvConnectionString" connectionString="..."/>
      </connectionStrings>
      ...
      <profile defaultProvider="SqlSrvProfileProvider">
         <providers>
          <add name="SqlSrvProfileProvider"
            type="System.Web.Security.SqlProfileProvider"
            connectionStringName="SqlSrvConnectionString"
            applicationName="WebShop" 
            commandTimeout="30"
            description="SqlSrvProfileProvider" />
         </providers>
        <properties>
          ...
        </properties>
      </profile>
      ...
    </system.web>

    这样你就为你的应用程序注册了一个"WebShop"名称
    (也可以不明确配置applicationName值,默认为应用程序的虚拟根路径,即"/")。
    要注意的是如果你那天把"WebShop"改成了"WebShop1"
    (改成"webshop"、"webShop"等就和没改一样,因为应用程序名称是不区分大小写的),
    你以前的用户自定义属性值就人间蒸发了,因为ProfileProvider把"WebShop1"
    当作一个新的应用程序又新注册了一遍(这时候看过我这篇文章的兄弟
    就该知道怎么办了,哈哈)。

    那4个Provider是否一定要配置成同样的applicationName呢?当然不必要啦!
    你为每个Provider各建一个数据库都没有关系,何况区区applicationName值呢。
    不过在此老小弟建议各位兄弟,别没事找事,还是取一样的名称好。
  2. 基本用户表
    aspnetdb Diagram

    表中MobileAlias字段(以及用户成员资格表aspnet_MemberShip中的MobilePIN字段),
    没见在那里用到。老小弟猜想微软这样做有两种可能:一种是想以后帐户和手机绑定,
    另一种可能就是为手机上网而预留的。

    不知各位DBA兄弟有没看出这个表与它的几个从表的关系,有点不太“讲道理”,
    居然有2个一对一的关系。“为什么不合并?不知道第3范式啊?”,老小弟
    以前想装文化人的时候,总是这样吓唬小小弟的。若干年后,当老小弟看了几本
    架构/模式的书,自我扫盲之后,才知道其实这是ORM模式中的一种。

    另外,微软工程师这样设计还是非常巧妙的。在将公有部分提成几张基本表后,
    数据库关系图4个部分就可合可分了。你可以试着在数据库关系图盖掉某几个部分,
    剩下的部分仍然能够成一个完整的系统。

    最后再交待一下IsAnonymous和LastActivityDate两个字段。
    因为个性化用户配置和页面个性化设置能够支持匿名用户,所以该表中也会存在匿名用户,
    IsAnonymous字段就是指示用户是否为匿名用户的标志字段。
    LastActivityDate字段记录用户最后活动时间。该字段十分重要,每次成功的操作都会更新它,
    同时它也是判断用户是否为非活动用户的依据之一。很多存储过程都会用到它。
         在分块描述4大部分之前,先容我简单地介绍一下两个独立的表:
         aspnet_WebEvent_Events表:记录数据操作的事件日志(可由SqlWebEventProvider启用)。
         aspnet_SchemaVersions表:
         aspnetdb Diagram
         把它的内容贴出来,各位一看就知道了。原来是微软为数据库中的各个部分设置的版本号。

(2).ASPNETDB 表和视图(2) 用户成员资格和角色管理 表

用户成员资格表

相信各位兄弟看了上面这张表,对大部分字段的意思都已了然于胸了。
老小弟在此只为大家理一理剩下的“小部分字段”:
  1. PasswordFormat:密码格式?其实是密码加密方式,其.NET类型为MembershipPasswordFormat枚举。
    下面列出 MembershipPasswordFormat 枚举的3个值:
      Clear          不加密;
      Encrypted   使用web.config中machineKey指定的方法加密/解密;
      Hashed       使用单向 Salted 哈希技术进行加密(注意是单向加密,所以密码是无法检索的)。

    PasswordSalt:上面提到单向 Salted哈希技术在加密时会随机生成一个Salt,该字段就是存放这个Salt值的 。
  2. MobilePIN:手机PIN码,现在还不知道有什么用。参见基本用户表(aspnet_Users)中的MobileAlias字段。
     
  3. IsApproved:微软的定义是:表示是否可以对成员资格用户进行身份验证。
    是否对用户启用成员资格身份验证,在设置为不启用的情况下(其实就是禁用),
    即使用户提供了正确的用户名和密码也是无法成功登录的。(VS->项目->ASP.NET配置->ASP.NET网站管理工具->安全->用户“活动用户”选项)
  4. FailedPasswordAttemptCount:连续登录失败的次数(用户名正确,密码无效),
    和web.config中设置的maxInvalidPasswordAttempts值相比较决定是否锁定用户成员资格帐户。

    FailedPasswordAttemptWindowStart:记录首次登录失败的时间。
  5. FailedPasswordAnswerAttemptCount:连续回答密码问题失败的次数。

    FailedPasswordAnswerAttemptWindowStart :记录首次失败的时间,
    和web.config中设置的passwordAttemptWindow值相比较决定是否锁定用户成员资格帐户。
下面再贴出web.config中有关用户成员资格的片段,
所有 以颜色Fuchsia标注的都是SqlMembershipProvider的属性。
<system.web>
  ...
  < machineKey
     validationKey="AutoGenerate,IsolateApps"
     decryptionKey="AutoGenerate,IsolateApps"
     validation="SHA1" 
  />
  ...
  <connectionStrings>
    <add name="SqlSrvConnectionString" connectionString="..."/>
  </connectionStrings>
  ...
  <membership defaultProvider="SqlSrvMembershipProvider"> 
    <providers>
      <add name="SqlSrvMembershipProvider"
        type="System.Web.Security.SqlMembershipProvider"
        connectionStringName="SqlSrvConnectionString"
        applicationName="WebShop" 
        commandTimeout="30"
        description="SqlSrvMembershipProvider"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
        requiresQuestionAndAnswer="true"
        requiresUniqueEmail="false"
         passwordFormat="Hashed"
         maxInvalidPasswordAttempts="5"
         passwordAttemptWindow="10"
         minRequiredPasswordLength="6"
         minRequiredNonalphanumericCharacters="0"
         passwordStrengthRegularExpression=""/>
   </providers>
  </membership>
  ...
</system.web>


角色表


用户与角色关联表

上面两个有关角色管理的表,更是一目了然。如果要多说几句的话,那就是通过
aspnet_UsersInRoles这个关联表把用户表和角色表之间的多对多关系转化为两个一对多的关系,
而这正是关系数据库所要求的。

特别注意,如果你要为你的用户添加角色管理,在web.config中必须显式启用( enabled="true"),
在默认情况下,用户角色是不启用。

web.config片段:
<system.web>
  ...
  <roleManager enabled="true">
    ...
  <roleManager/>
  ...
</system.web>

(3).ASPNETDB 表和视图(3) 个性化用户配置、页面个性化设置 表 和视图

个性化用户配置(用户自定义属性)表


由此表结构可以看出,所有的用户自定义属性最后都是“打包”(序列化)成一个或两个数据块,
存放在PropertyValuesString(序列化为string、Xml) 和(或) PropertyValuesBinary(序列化为Binary)
两个(或其中之一)字段中,因此要求用户自定义属性必须支持序列化。

序列化方式可由web.config中的 serializeAs指定,SqlProfileProvider默认序列化方式为String。

例如用户在web.config中配置了如下自定义属性,这里的 serializeAs="String" 仅仅为了表示
可以用户可以自行指定序列化方式,谢不写是一个样的:

<system.web>
  ...
  <connectionStrings>
    <add name="SqlSrvConnectionString" connectionString="..."/>
  </connectionStrings>
  ...
  <profile defaultProvider="SqlSrvProfileProvider">
     <providers>
       ...
         </providers>
    <properties>
         <add name="ThemeName" type="System.String"  serializeAs="String" />
         <group name="addPersonalInfo">
             <add name="FirstName" type="System.String"  serializeAs="String" />
             <add name="LastName" type="System.String" serializeAs="String"  />
            <add name="Birthday" type="System.DateTime" serializeAs="String" />
         </group>
      </properties>
  </profile>
  ...
</system.web> 

并运行了aspx页面中的以下C#代码:

this.Profile.ThemeName = "Blue";
this.Profile.PersonalInfo.FirstName = "John";
this.Profile.PersonalInfo.LastName = "Smith";
this.Profile.PersonalInfo.Birthday = new DateTime(1970, 11, 22);

然后打开数据库中的aspnet_Profile查看表,两个字段的内容分别为:
PropertyNames:        "PersonalInfo.FirstName:S:0:4:PersonalInfo.Birthday:S:4:81:PersonalInfo.LastName:S:85:5:ThemeName:S:90:4:"
PropertyValuesString:"John 1970-11-22T00:00:00SmithBlue"

注:以后在实现自定义用户配置提供程序(ProfileProvider) 一文中我会更详尽地讨论。


有关页面个性化设置的3个表

关系图


页面路径(地址)表


处于共享范围(Shared Scope)的页面个性化设置表


处于单用户范围(User Scope)的页面个性化设置表



视图
  1. aspnet_Applications表的全表视图。

    vw_aspnet_Applications
  2. aspnet_Membership表与aspnet_Users表的关联视图

    vw_aspnet_MembershipUsers
  3. 返回aspnet_Profiles表的用户ID、上次修改时间
    和属性名称串、字符串属性值、二进制属性值的总长度

    vw_aspnet_Profiles
  4. aspnet_Roles表的全表视图。

    vw_aspnet_Roles
  5. aspnet_Users表的全表视图。

    vw_aspnet_Users
  6. aspnet_UsersInRoles表的全表视图。

    vw_aspnet_UsersInRoles
  7. aspnet_Paths表的全表视图。

    vw_aspnet_WebPartState_Paths
  8. 返回aspnet_PersonalizationAllUsers表的页面路径ID、
    以二进制形式保存的页面配置属性的长度和上次修改时间。

    vw_aspnet_WebPartState_Shared
  9. 返回aspnet_WebPartState_User表的页面路径ID、用户ID、
    以二进制形式保存的页面配置属性的长度和上次修改时间。

    vw_aspnet_WebPartState_User

 

DataShow是一款基于.net Framework2.0的Microsoft SQL Server数据库建模工具,工具全部采用C#代码完成。该工具旨在利用自定义字典的功能来设计强大的数据库控件或者页面,减少开发周期和代码量。 本工具具有如下特点: 1、支持自定义的种类,将创建的予以分类。 在创建种类时您可以为种类设置此种的模板列,在创建该种类的时,工具会提示您载入模板列,这种设计可以减少同类多次创建时的工作量。 2、种类包含一个前缀,有利于数据库的命名规范。 3、创建/编辑定义时,您可以拷贝、粘贴多个列以减少创建时的工作量。 4、每个列都包含编辑格式、列宽、显示格式等多种自定义属性,在设计控件时,您可以根据这些属性为不同的字段设计不同的编辑控件。 当然除了以上列举的属性外,还有部分未被设计进本工具的属性,如验证属性、查询属性等。关于这方面的应用请参考本工具的预览功能。 5、编辑格式及预览功能支持您自行扩展的用户控件以进行更高级的设计。 您可以创建一个项目,添加对DataShow.Interfaces.dll的引用,并实现其中的接口,将编译好的DLL添加到[选项]->[插件]的列中即可在编辑格式或预览时看到您自定义的用户控件。 6、支持对数据库关系的维护。 在创建/编辑定义时,您都可以打开关系设计界面对关系进行维护。 7、递归式的数据库修改。 当您更改某个受关系影响的列的数据类型、长度、精度、小数位数等信息时,关系中的其他字段将随之更改,这个过程是递归的,所有与该字段有直接或间接关系引用的字段都将受到更改。 8、为更改生成SQL脚本。 使用生成SQL脚本的功能,您可以像使用企业管理器一样为任意修改生成SQL脚本,通过工具内置的SQL执行工具,您可以将更改应用于多台开发机上以保持数据库的一致。 9、与自定义控件结合,使您在做定义时即时预览到自定义控件的绑定效果。 10、内置有SQL执行工具,该工具是一款简单的查询分析器,目的旨在将您对数据库所做的更改快速布置到其他开发机上。 复杂的SQL语句建议您使用查询分析器完成。 11、字典生成器让您快速地将本工具使用溶入开发中。 可能您的项目已经着手开发一段时间了,即使是这样,您依然可以让本工具为您效劳。您只需打开字典生成工具,工具会读取数据库中所有的及字段信息,根据您的配置生成字典。 12、数据库设计文档生成功能。 文档生成工具将根据您的定义和字段定义读取字典中的信息并将这些信息按照您定义的方式生成数据库设计文档。生成方式采用写流方式生成,生成速度快,免去您编写数据库文档的麻烦。 13、备份、还原、收缩数据库功能。 14、数据预览及编辑功能。 您可以在选项中关闭修改显示的数据的功能。 15、工具包括多项人性化选项。 16、定义说明:工具使用初期,工具会检查您数据库中的是否已经存在Dic_Columns、Dic_Datatypes、Dic_Relation、Dic_RelationDetail、Dic_Sequence、Dic_Tables、Dic_TableTemplate以及Dic_TableType,如果您的数据库中不存在这些,工具会自行创建。 Dic_Columns:存储字段信息,各个字段的说明请查看字义。 Dic_Datatypes:存储数据类型信息。 Dic_Relation:存储关系,各个字段的说明请查看字义。 Dic_RelationDetail:存储关系的字段关联信息,各个字段的说明请查看字义。 Dic_Sequence:用于生成序列号,一般是用于生成主键编号,请勿修改这个的数据。 Dic_Tables:存储的字典信息。 Dic_TableTemplate:存储种类的字段模板,各个字段的说明请查看字义。 Dic_TableType:存储种类信息。 关于作者: 作者:陈鹏伟 联系方式:QQ 89202269 手机:13788892380。 此工具是本人利用业余时间编写数月的成果,转载请保留作者信息。 由于水平有限且没有专门的测试人员做测试= =!BUG在所难免,如果您有任何意见或建议,或者希望索取源码,欢迎与本人联系。 特别鸣谢:张希禄 我的启蒙老师,这个工具的设计来自他关于DataShow的思路。 希望本工具能为您的开发带来方便!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值