Опубликован: 25.05.2011 | Уровень: специалист | Доступ: платный
Лекция 7:

Azure Services Platform

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Пример

В приведенных ниже примерах описываются операции с таблицей "Blogs". В этой таблице хранятся блоги для приложения MicroBlogging.

В приложении MicroBlogging есть две таблицы: Channels (Каналы) и Blogs (Блоги). Имеется список каналов, блоги публикуются в определенном канале. Пользователи подписываются на каналы и ежедневно получают новые блоги этих каналов.

В данном примере рассмотрим только таблицу Blogs и приведем примеры следующих операций с ней:

  1. Описание схемы таблицы
  2. Создание таблицы
  3. Вставка блога в таблицу
  4. Получение списка блогов из таблицы
  5. Обновление блога в таблице
  6. Удаление блога из таблицы

Схема таблицы описывается как C#-класс. Такую модель использует ADO.NET Data Services. Схема известна только клиентскому приложению и упрощает доступ к данным. Сервер схему не применяет.

Рассмотрим описание сущностей Blog, хранящихся в таблице Blogs. Каждая сущность блога содержит следующие данные:

  1. Имя канала (ChannelName) – канал, в котором размещается блог.
  2. Дата размещения.
  3. Текст (Text) – содержимое тела блога.
  4. Рейтинг (Rating) – популярность этого блога.

Во-первых, обратите внимание, что для таблицы определен PartitionKey, представляющий имя канала, частью которого является блог, и в качестве RowKey используется дата размещения блога. PartitionKey и RowKey – ключи таблицы Blogs, они объявляются посредством атрибута класса DataServiceKey (Ключ сервиса данных). То есть таблица Blogs секционирована по именам каналов (ChannelName). Это позволяет приложению эффективно извлекать самые недавние блоги канала, на который подписан пользователь. Кроме ключей, в качестве свойств объявлены характерные для пользователя атрибуты. Все свойства имеют открытые (public) методы считывания и присвоения значения и хранятся в таблице Windows Azure Table. Итак, в примере ниже:

  • Text и Rating хранятся для экземпляра сущности в таблице Azure.
  • RatingAsString нет, потому что для него не определен метод присвоения значения.
  • Id не хранится, потому что методы доступа не public.
[DataServiceKey("PartitionKey", "RowKey")]  
 public class Blog  
 {  
 // ChannelName  
 public string PartitionKey { get; set; }  
 // PostedDate  
 public string RowKey { get; set; }  
 // Определяемые пользователем свойства  
 public string Text { get; set; }  
 public int Rating { get; set; }  
 public string RatingAsString { get; }  
 protected string Id { get; set; }  
  }

Далее рассмотрим, как создать таблицу Blogs для учетной записи хранилища. Создание таблицы аналогично созданию сущности в основной таблице "Tables". Эта основная таблица определена для каждой учетной записи хранилища, и имя каждой таблицы, используемой учетной записью хранения, должно быть зарегистрировано в основной таблице. Описание класса основной таблицы приведено ниже, где свойство TableName (Имя таблицы) представляет имя создаваемой таблицы.

[DataServiceKey("TableName")] 
 public class TableStorageTable  
 { 
 public string TableName { get; set; }  
 }

Фактическое создание таблицы происходит следующим образом:

// Uri сервиса: "http://<Account>.table.core.windows.net/"  
 DataServiceContext context = new DataServiceContext(serviceUri);  
 TableStorageTable table = new TableStorageTable("Blogs");  
 // Создаем новую таблицу, добавляя новую сущность  
 // в основную таблицу "Tables"  
 context.AddObject("Tables", table);  
 // результатом вызова SaveChanges является отклик сервера  
 DataServiceResponse response = context.SaveChanges();

serviceUri – это uri сервиса таблицы, http://<Здесь указывается имя учетной записи>.table.core.windows.net/. DataServiceContext (Контекст сервиса данных) – один из основных классов сервиса данных ADO.NET, представляющий контекст времени выполнения для сервиса. Он обеспечивает API для вставки, обновления, удаления и запроса сущностей с помощью либо LINQ, либо RESTful URI и сохраняет состояние на стороне клиента.

Рассмотрим вставку элемента Blog. Чтобы вставить сущность, приложение должно выполнить следующее.

  1. Создать новый C#-объект и задать все свойства.
  2. Создать экземпляр DataServiceContext, который представляет подключение к серверу в сервисе данных ADO .NET для вашей учетной записи хранилища.
  3. Добавить C#-объект в контекст.
  4. Вызвать метод SaveChanges (Сохранить изменения) объекта DataServiceContext для отправки запроса серверу. Это обеспечивает отправку на сервер HTTP-запроса с сущностью в XML-формате ATOM.

Далее представлены примеры кода для перечисленных выше операций:

Blog blog = new Blog {  
 PartitionKey = "Channel9", // ChannelName  
 RowKey = DateTime.UtcNow.ToString(), // PostedDate  
 Text = "Hello",  
 Rating = 3  
 };  
 serviceUri = new Uri("http://<account>.table.core.windows.net");
 var context = new DataServiceContext(serviceUri);  
 context.AddObject("Blogs", blog);  
 DataServiceContext response = context.SaveChanges();

Запрос сущностей выполняется с помощью встроенного в C# языка запросов LINQ (Language Integrated Query). В данном примере извлечем все блоги, рейтинг которых равен 3.

При обработке запроса (например, с помощью выражение foreach), он передается на сервер. Сервер отправляет результаты в XML-формате ATOM. Клиентская библиотека ADO .NET Data Services десериализует результаты в C#-объекты, после чего они могут использоваться приложением.

var serviceUri = new Uri("http://<account>.table.core.windows.net");
 DataServiceContext context = new DataServiceContext(serviceUri);  
 // LINQ-запрос с использованием DataServiceContext для выбора  
 // из таблицы Blogs всех сущностей блогов, для которых rating = 3  
 var blogs =  
 from blog in context.CreateQuery<blog>("Blogs")  
 where blogs.Rating == 3  
 select blog;  
 // запрос отправляется на сервер и выполняется  
 foreach (Blog blog in blogs) { }

Обновление сущности выполняется следующим образом.

  1. Создается DataContext (Контекст данных), свойству MergeOption (Вариант объединения) которого задается значение OverwriteChanges (Перезапись изменений) или PreserveChanges (Сохранение изменений), как описывается в разделе 4.8. Это обеспечивает правильную обработку ETag для каждого извлекаемого объекта.
  2. С помощью LINQ DataContext получает сущность, которая будет обновляться. Извлечение ее с сервера гарантирует обновление ETag в сущностях, отслеживаемых контекстом, и то, что при последующих обновлениях и удалениях в заголовке if-match будет использоваться обновленный ETag. Меняем C#-объект, представляющий сущность.
  3. Возвращаем C#-объект в тот же DataContext для обновления. Использование того же DataContext гарантирует автоматическое повторное использование ETag, полученного ранее для этого объекта.
  4. Вызываем метод SaveChanges для отправки запроса на сервер.
Blog blog =  
 (from blog in context.CreateQuery<blog>("Blogs")  
 where blog.PartitionKey == "Channel9"  
 && blog.RowKey == "Oct-29"  
 select blog).FirstOrDefault(); 
 blog.Text = "Hi there";  
 context.UpdateObject(blog);  
 DataServiceResponse response = context.SaveChanges();
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Нияз Сабиров
Нияз Сабиров

Здравствуйте. А уточните, пожалуйста, по какой причине стоимость изменилась? Была стоимость в 1 рубль, стала в 9900 рублей.

Елена Сапегова
Елена Сапегова

для получения диплома нужно ли кроме теоретической части еще и практическую делать? написание самого диплома требуется?

Вадим Жук
Вадим Жук
Беларусь, г.бобруйск
Владимир Гляделов
Владимир Гляделов
Россия, Набережные Челны