技术开发 频道

Azure Services探索:存储之表(Table)存储

  进一步的说,我们不用写数据库的建表脚本来建立在Azure存储系统中建了表存储,而是根据上述的规则,我们告诉Windows Azure我们的实体是什么,ParitionKey 和RowKey分别是什么,怎么赋值,即满足规则2和规则3的要求,Windows Azure自动就会帮你建立表,建立索引甚至存储节点。之后你通过公开的API就可以访问这些表了。

  具体的操作是,我们需要从Microsoft.Samples.ServiceHosting.StorageClient. TableStorageEntity 继承派生出我们的聊天消息实体类,这个类的定义和描述,其实就是实体类与表模型的脚本,之后我们可以通过开发工具或代码执行,告诉Windows Azure建立这个实体的表存储。差别是如果通过开发工具表存储是预先建立的,代码建立表可以在运行时,访问表存储之前建立。这也就是上面说的Create Tables Only Once的问题了,因为这存在一个什么是创建表的最好时机的问题,本练习时通过开发工具来预先建立表存储。

  聊天消息实体类的定义如下:

1: using Microsoft.Samples.ServiceHosting.StorageClient;    
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 继承派生一个类,就可以创建自己的数据查询和访问的类:

1: using Microsoft.Samples.ServiceHosting.StorageClient;    
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的开发环境中预先建立表存储

0
相关文章