为数据列使用可移植型数据类型
数据列的数据类型应该可移植到SQL数据类型,或可以被转换为系统定义的基本数据类型。
使用Windows Azure开发工具生成数据表
使用Azure SDK提供的开发工具调用开发存储服务生成数据库和数据表,开发工具分析所有项目的数据对象生成数据结构,数据表的数量等于衍生自TableStorageEntity类的数据实体类的数量,列的数量等于该数据实体类公共访问属性的数量。
非可移植数据类型解决方案
如果数据类型是自定义的,SDK开发工具将不能调用DevelopmentStorage.exe和DevtableGen.exe,下面的例子展示了在数据表中使用自定义数据列类型的解决方案,我们定义了两个数据对象类 - State和Address,State是枚举类型,它有59个成员,代表美国邮政服务使用的州,每个Address类有一个使用这个自定义类型的属性成员。这两个类的定义如下:
{
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输出窗口显示的错误消息是:
found or they did not meet the requirements for the table storage.
光从这个错误输出信息看不出失败的原因,我们可以通过以下步骤重新生成数据表:
1、让State类型继承int类型,因为int是系统定义的类型,是可移植到SQL数据库的;
2、在Address类中,使用State类型定义一个成员变量_state;
3、应用.NET可为空设计模式给这个成员变量;
4、执行类型转换。
下面是修改后的代码:
{
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 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 | 使用条款 |
空字符串 | 空字符串 | 一个分区或一行 |
有值 | 空字符串 | 多个分区或一行 |
空字符串 | 有值 | 一个分区或每个分区有多行 |
有值 | 有值 | 多个分区或每个分区有多行 |