进一步的说,我们不用写数据库的建表脚本来建立在Azure存储系统中建了表存储,而是根据上述的规则,我们告诉Windows Azure我们的实体是什么,ParitionKey 和RowKey分别是什么,怎么赋值,即满足规则2和规则3的要求,Windows Azure自动就会帮你建立表,建立索引甚至存储节点。之后你通过公开的API就可以访问这些表了。
具体的操作是,我们需要从Microsoft.Samples.ServiceHosting.StorageClient. TableStorageEntity 继承派生出我们的聊天消息实体类,这个类的定义和描述,其实就是实体类与表模型的脚本,之后我们可以通过开发工具或代码执行,告诉Windows Azure建立这个实体的表存储。差别是如果通过开发工具表存储是预先建立的,代码建立表可以在运行时,访问表存储之前建立。这也就是上面说的Create Tables Only Once的问题了,因为这存在一个什么是创建表的最好时机的问题,本练习时通过开发工具来预先建立表存储。
聊天消息实体类的定义如下:
2:
3: namespace WorkingWithTables_WebRole
4:
5: {
6:
7: public class myMessages : TableStorageEntity
8:
9: {
10:
11: public myMessages()
12:
13: {
14:
15: PartitionKey = "mymessages";
16:
17: RowKey = string.Format("{0:10}_{1}", DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid());
18:
19: // TimeSpan
20:
21: }
22:
23: public string Name { get; set; }
24:
25: public string Body { get; set; }
26:
27: }
28:
在构造函数里,我们定义了最关键的ParitionKey 和RowKey是如何定义,因为这个表非常简单,所以ParitionKey的赋值我给的是一个固定的值,没有按照规则4和规则5的要求来优化,之后是我们的自定义的属性Name和Body。
之后顺手再定义一个表的访问类,非常像DAL,因为上面的只是一个表定义类,我们的应用最终是需要访问这个表存储中的数据。这个我们需要从Microsoft.Samples.ServiceHosting.StorageClient. TableStorageDataServiceContext 继承派生一个类,就可以创建自己的数据查询和访问的类:
2:
3: public class MessageDataServiceContext : TableStorageDataServiceContext
4:
5: {
6:
7: public MessageDataServiceContext(StorageAccountInfo accountinfo)
8:
9: : base(accountinfo)
10:
11: {
12:
13: }
14:
15: public IQueryable<myMessages> Messages
16:
17: {
18:
19: get
20:
21: {
22:
23: return this.CreateQuery<myMessages>("Messages");
24:
25: }
26:
27: }
28:
29: public int AddMessage(string name, string body)
30:
31: {
32:
33: int ret = -1;
34:
35: try
36:
37: {
38:
39: this.AddObject("Messages", new myMessages { Name = name, Body = body });
40:
41: this.SaveChanges();
42:
43: ret = 0;
44:
45: }
46:
47: catch (Exception e)
48:
49: {
50:
51: throw e;
52:
53: }
54:
55: finally
56:
57: {
58:
59: }
60:
61: return ret;
62:
63: }
64:
65: }
66:
之后在Azure的开发环境中预先建立表存储