云计算 频道

Windows Azure实战:如何创建云数据存储

  为数据列使用可移植型数据类型

  数据列的数据类型应该可移植到SQL数据类型,或可以被转换为系统定义的基本数据类型。

  使用Windows Azure开发工具生成数据表

  使用Azure SDK提供的开发工具调用开发存储服务生成数据库和数据表,开发工具分析所有项目的数据对象生成数据结构,数据表的数量等于衍生自TableStorageEntity类的数据实体类的数量,列的数量等于该数据实体类公共访问属性的数量。

  非可移植数据类型解决方案

  如果数据类型是自定义的,SDK开发工具将不能调用DevelopmentStorage.exe和DevtableGen.exe,下面的例子展示了在数据表中使用自定义数据列类型的解决方案,我们定义了两个数据对象类 - State和Address,State是枚举类型,它有59个成员,代表美国邮政服务使用的州,每个Address类有一个使用这个自定义类型的属性成员。这两个类的定义如下:

public enum State
    {
        AL,AK,
AS,AZ,AR,CA,CO,CT,DE,DC,FM,FL,GA,GU,HI,
        ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA,MI,MN,MS,MO,
        MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,
OR,PW,PA,
        PR,RI,SC,SD,TN,TX,UT,VT,VI,VA,WA,WV,WI,WY
    }

    
public class Address : TableStorageEntity
    {
        ...
        
public State State { get; set; }
        ...
    }

   当我们再次调用创建测试存储表时,将会要求我们移除数据库中的现有存储,如下图所示。

可遵循的一些规则和非常好的实践

  图 8 删除现有存储表的确认对话框

  点击“是”,弹出一个执行失败的对话框,如下图所示。

可遵循的一些规则和非常好的实践

  图 9 创建开发存储表失败的消息提示框

  Visual Studio输出窗口显示的错误消息是:

DevTableGen(0,0): error DG10: No tables were generated. Either no candidate classes were  
found
or they did not meet the requirements for the table storage.

   光从这个错误输出信息看不出失败的原因,我们可以通过以下步骤重新生成数据表:

  1、让State类型继承int类型,因为int是系统定义的类型,是可移植到SQL数据库的;

  2、在Address类中,使用State类型定义一个成员变量_state;

  3、应用.NET可为空设计模式给这个成员变量;

  4、执行类型转换。

  下面是修改后的代码:

public enum State : int
    {
        AL,AK,
AS,AZ,AR,CA,CO,CT,DE,DC,FM,FL,GA,GU,HI,
        ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA,MI,MN,MS,MO,
        MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,
OR,PW,PA,
        PR,RI,SC,SD,TN,TX,UT,VT,VI,VA,WA,WV,WI,WY
    }


    
public class Address : TableStorageEntity
    {
        
private State _state;

        
public int? State
        {
            
get { return (int)_state; }
            
set { _state = (State)value; }
        }
    }

   完成修改后,使用Visual Studio重新生成表,错误将会消失,在本地SQL数据库中重新创建表成功。

  数据上下文类继承

  除了数据实体类外,对于每一个数据存储表,必须定义一个继承自TableStorageDataServiceContext的类,如:

public class UserDataContext : TableStorageDataServiceContext
    {
        ...
        
public DataServiceQuery<Address> AddressTable
        {
            
get
            {
                CreateQuery
<Address>(ConfigurationManager.AppSettings["AddressTable"]);
            }
        }
        ...
    }

   使用PartitionKey和RowKey组织分散的数据

  为了支持负载均衡,云中的表和实体都是跨存储节点分区的,也就是说,物理上可能是位于不同服务器上的,每个分区容纳连续范围的实体,它们的分区键值相同,分区就是通过分区键组织的。我们在表上指定了PartitionKey属性为分区键,分区键必须是唯一的,分区键是由实体主键和RowKey组成的。

  对于每一个数据表实体,数据可以根据PartitionKey和RowKey组织,PartitionKey和RowKey的值可以允许是空字符串,但不能是null,下表显示了PartitionKey和RowKey可能的组合。

  表 1 使用PartitionKey和RowKey组织表结构

PartitionKey
RowKey
使用条款
空字符串
空字符串
一个分区或一行
有值
空字符串
多个分区或一行
空字符串
有值
一个分区或每个分区有多行
有值
有值
多个分区或每个分区有多行

0
相关文章