Горизонтальное масштабирование SQL Azure

advertisement
Практическая работа
Горизонтальное масштабирование
SQL Azure (федерация)
Версия работы: 1.0.0
Дата последнего обновления: 1/17/2016
СОДЕРЖАНИЕ
ОБЩИЕ СВЕДЕНИЯ ...................................................................................................................................3
УПРАЖНЕНИЕ 1. РАБОТА С ФЕДЕРАЦИЯМИ ........................................................................................5
Задача 1. Добавление федерации в существующую базу данных ....................................... 5
Задача 2. Создание федеративных таблиц и вставка данных ............................................... 7
Задача 3. Выполнение операций разбиения федерации .................................................... 10
Проверка .................................................................................................................................. 12
УПРАЖНЕНИЕ 2. РАБОТА С ФЕДЕРАТИВ-НЫМИ ТАБЛИЦАМИ ИЗ ADO.NET ..............................17
Задача 1. Добавление кода для запросов к федеративным таблицам .............................. 17
Задача 2. Добавление кода для выполнения операций CRUD
с федеративной таблицей ...................................................................................................... 24
Задача 3. Добавление кода для выполнения всеобъемлющих запросов ......................... 27
Проверка .................................................................................................................................. 28
УПРАЖНЕНИЕ 3. РАБОТА С ФЕДЕРАТИВ-НЫМИ ТАБЛИЦАМИ С ПОМОЩЬЮ ENTITY
FRAMEWORK ............................................................................................................................................34
Задача 1. Добавление кода для запросов к федеративным таблицам .............................. 34
Задача 2. Добавление кода для выполнения операций CRUD
с федеративной таблицей ...................................................................................................... 41
Задача 3. Добавление кода для выполнения всеобъемлющего запроса .......................... 43
Проверка .................................................................................................................................. 45
СВОДКА .....................................................................................................................................................50
Общие сведения
Одним из основных достоинств Windows Azure является возможность динамически изменять
масштаб, адаптируя его к меняющимся потребностям. Емкость одной база данных SQL Azure
ограничена с точки зрения размера и пропускной способности транзакций. Чтобы увеличить
емкость, необходимо разделить данные по нескольким базам данных SQL Azure. Для
освобождения емкости необходимо объединить несколько баз данных SQL Azure в одну.
Этот подход называется сегментированием баз данных. Федерации SQL Azure (в настоящее
время в версии CTP) — это встроенная функция базы данных SQL Azure, которая существенно
упрощает сегментирование базы данных.
Цели
На этом практическом занятии рассматриваются следующие вопросы.
 Добавлять федерации в базу данных и разделять их на членов федерации.

Выполнять запросы и операции CRUD с федеративными таблицами с помощью
ADO.NET.
 Выполнять запросы и операции CRUD с федеративными таблицами с помощью
ADO.NET Entity Framework.
Предварительные требования
Для этой практической работы необходимо иметь следующее.

Microsoft® .NET Framework 4

Microsoft® Visual Studio 2010

ASP.NET и ASP.NET MVC 3

SQL Server 2008 R2 Management Studio Express пакет обновления 1 (SP1)

Пакет Windows Azure SDK и инструменты Windows Azure для Microsoft Visual Studio 1.6

Доступ к SQL Azure Federations CTP 2
Установка
Для запуска решений из этой практической работы необходимо установить и настроить среду.
Следующие шаги помогут вам собрать необходимые сведения и выполнить скрипт установки
для настройки среды.
Примечание. Перед запуском программы установки удостоверьтесь в выполнении
предварительных условий для выполнения этой практической работы.
Создание сервера и базы данных SQL Azure
Для выполнения упражнений, приведенных в этой практической работе, необходимо
установить среду.
1. Откройте окно проводника Windows и перейдите в папку Source практической работы.
2. Дважды щелкните файл Setup.cmd в этой папке, чтобы запустить процесс установки,
который настроит среду и установит фрагменты кода Visual Studio для этой
практической работы.
3. Если откроется диалоговое окно контроля учетных записей, подтвердите выполнение
действия.
4. При появлении подсказки создать сертификат нажмите клавишу Y для создания
нового сертификата или N, если у вас есть установленный на локальном компьютере
сертификат, и передайте его как сертификат управления на портал управления.
5. Если выбрано создание нового сертификата, скрипт приостановит работу для
передачи его на портал управления. Передайте сертификат на портал управления
в раздел сертификатов и запомните его отпечаток.
6. При запросе введите свой идентификатор подписки на Windows Azure и отпечаток
сертификата управления Windows Azure. Кроме того, вам необходимо будет ввести
свой внешний IP-адрес. Это нужно для создания соответствующих правил
брандмауэра, чтобы ваш компьютер мог войти в портал управления.
7. При запросе введите имя пользователя и пароль для учетной записи
администрирования.
8. Программа установки сообщит, когда закончит создание нового сервера, правил
брандмауэра и образца базы данных.
Использование фрагментов кода
По всему тексту практической работы имеются инструкции по вставке блоков кода. Для
удобства большая часть этого кода предоставляется в виде фрагментов кода Visual Studio,
которые можно использовать в Visual Studio 2010, чтобы не добавлять код вручную.
Если вы не знакомы с фрагментами кода Visual Studio, то научиться пользоваться ими можно
в документе Setup.docx в папке Assets обучающего набора, в котором есть раздел
с описанием использования таких фрагментов.
Упражнения
Эта практическая работа включает следующие упражнения:
1. Упражнение 1 — работа с федерациями
2. Упражнение 2 — работа с федеративными таблицами с помощью ADO.NET
3. Упражнение 3 — работа с федеративными таблицами с помощью Entity Framework
Примечание. В каждой папке с исходным кодом для данной практической работы есть
папка End, где находится решение Visual Studio с кодом, представленным в том виде,
который он должен принять после выполнения вами упражнения. Это решение можно
использовать в качестве примера, если при работе над упражнениями вам нужна будет
дополнительная помощь.
Обратите внимание, что, если вы используете решения из папки End, не выполняя
практическую работу, для некоторых из них может потребоваться настройка вручную.
Для этого следуйте инструкциям, приведенным в каждом файле README.txt,
расположенном в папке End, где находится это решение.
Предполагаемое время выполнения данной практической работы: 60 минут
Упражнение 1. Работа с федерациями
В этом упражнении вы добавите федерацию в существующую базу данных. Вы узнаете, как
работать с федеративными таблицами и ссылочными таблицами, которые не являются
федеративными. Кроме того, вы узнаете, как разбить одного члена федерации на два члена
федерации.
Задача 1. Добавление федерации в существующую базу данных
Объект федерации можно создать в любой пользовательской базе данных. При первом
создании объекта федерации создается член федерации. По сути, это база данных, которая
управляется системой и охватывает весь диапазон данных. Федерации обеспечивают
масштабирование и распределение данных между членами федерации. В этой задаче
создается федерация по полю UNIQUEIDENTIFIER с именем CustId.
1. Откройте SQL Server Management Studio (среда SSMS), выбрав Пуск | Все
программы | Microsoft SQL Server 2008 R2 | SQL Server Management Studio.
2. В диалогом окне Подключение к компоненту ядра СУБД введите в поля Имя
сервера, Имя входа и Пароль имя базы данных, созданной при выполнении раздела
Установка этой практической работы, а также свои учетные данные и нажмите
кнопку Подключить.
Рис. 1
Подключение к базе данных
3. На ленте сверху щелкните Создать новый запрос.
4. Создайте новую федерацию Orders_Federation для существующей базы данных.
Для этой федерации необходимо определить ключ федерации, который будет
указываться при выполнении инструкций в федеративной базе данных. Задайте
для ключа федерации уникальное имя распределения CustId, тип распределения
UNIQUEIDENTIFIER и тип распределения Range. Для этого вставьте следующий код.
T-SQL
CREATE FEDERATION Orders_Federation (CustId UNIQUEIDENTIFIER RANGE)
GO
Примечание. В настоящее время ключи федерация могут быть только типа int,
bigint, uniqueidentifer или varbinary(n), где n не может быть больше 900.
5. Для запуска скрипта нажмите клавишу F5.
Задача 2. Создание федеративных таблиц и вставка данных
Члены федерации могут содержать федеративные таблицы, а также обычные объекты,
которые могут существовать в базе данных SQL Azure. Эти таблицы распределяют свои
данные по всем членам федерации. Таблицы, созданные со свойством FEDERATED ON,
являются федеративными таблицами. В этой задаче вы создаете таблицы Products,
Customers, Order и OrderItems, но федеративными будут только три из них.
1. Если окно SQL Server Management Studio (среда SSMS) закрыто, откройте его, выбрав
Пуск | Все программы | Microsoft SQL Server 2008 R2 | SQL Server Management
Studio, подключитесь к базе данных, созданной в предыдущей задаче, и нажмите
Создать новый запрос.
2. Подключитесь к члену федерации, созданному в предыдущей задаче. Для этого
необходимо использовать инструкцию USE FEDERATION со значением ключа
федерации, чтобы подключиться к определенному члену федерации, и задать
параметру FILTERING значение OFF, чтобы областью соединения был весь диапазон
члена федерации. Так как в этом случае нашей целью является вновь созданный
член федерации, мы задаем ключ федерации в поле UNIQUEIDENTIFIER
«эквивалентный нулю». Вставьте следующий код.
T-SQL
-- Подключение к федерации
USE FEDERATION Orders_Federation (CustId = '00000000-0000-00000000-000000000000') WITH RESET, FILTERING = OFF
GO
Примечание. Ключевое слово RESET делает сброс соединения явным.
3. Вставьте приведенный далее код для создания таблиц Products, Customers, Order
и OrderItems. Обратите внимание, что вы делаете федеративными только таблицы
с атрибутом FEDERATED ON, используя ограничение для определенного столбца,
который может содержать только допустимое значение ключа федерации.
T-SQL
-- Создание таблицы Products (ссылочные таблицы)
CREATE TABLE Products(
ProductID int NOT NULL,
SupplierID int NOT NULL,
ProductName nvarchar(50) NOT NULL,
Price decimal(12,2) NOT NULL,
PRIMARY KEY(ProductId) )
GO
-- Создание таблицы Customers
CREATE TABLE Customers(
CustomerID uniqueidentifier NOT NULL,
CompanyName nvarchar(50) NOT NULL,
FirstName nvarchar(50),
LastName nvarchar(50),
PRIMARY KEY (CustomerId) )
FEDERATED ON (CustId = CustomerID)
GO
-- Создание таблицы Orders
create table Orders
(
CustomerId uniqueidentifier NOT NULL,
OrderId uniqueidentifier NOT NULL,
OrderDate datetime,
PRIMARY KEY (OrderId, CustomerId)
)
FEDERATED ON (CustId = CustomerId)
GO
-- Создание таблицы OrderItems
CREATE TABLE OrderItems(
CustomerID uniqueidentifier NOT NULL,
OrderID uniqueidentifier NOT NULL,
ProductID int NOT NULL,
Quantity int NOT NULL,
PRIMARY KEY (OrderId, CustomerId, ProductId) )
FEDERATED ON (CustId = CustomerId)
GO
4. Теперь вставьте следующие строки для вставки образца данных в созданные ранее
таблицы.
T-SQL
-- Вставка образца данных
INSERT INTO Products (ProductID, SupplierID, ProductName, Price)
VALUES ( 386, 1001,
'Titanium Extension Bracket Left Hand',
5.25 )
GO
INSERT INTO Products (ProductID, SupplierID, ProductName, Price)
VALUES ( 387, 1001,
'Titanium Extension Bracket Right Hand',
5.25 )
GO
INSERT INTO Products (ProductID, SupplierID, ProductName, Price)
VALUES ( 388, 1001,
'Fusion Generator Module 5 kV',
10.50 )
GO
INSERT INTO Products (ProductID, SupplierID, ProductName, Price)
VALUES ( 389, 1001,
'Bypass Filter 400 MHz Low Pass', 10.50 )
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Van Nuys', 'Catherine', 'Abel')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Abercrombie', 'Kim', 'Branch')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Contoso', 'Frances', 'Adams')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'A. Datum Corporation', 'Mark', 'Harrington')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Adventure Works', 'Keith', 'Harris')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Alpine Ski House', 'Wilson', 'Pais')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Baldwin Museum of Science', 'Roger', 'Harui')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Blue Yonder Airlines', 'Pilar', 'Pinilla')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'City Power & Light', 'Kari', 'Hensien')
GO
INSERT INTO Customers (CustomerID, CompanyName, FirstName,
LastName)
VALUES (newid(), 'Coho Winery', 'Peter', 'Brehm')
GO
DECLARE @orderId UNIQUEIDENTIFIER
DECLARE @customerId UNIQUEIDENTIFIER
SET @orderId = NewId()
SELECT @customerId = CustomerId FROM Customers WHERE LastName =
'Hensien' and FirstName = 'Kari'
INSERT INTO Orders (CustomerId, OrderId, OrderDate)
VALUES (@customerId, @orderId, GetDate())
INSERT INTO OrderItems (CustomerID, OrderID, ProductID, Quantity)
VALUES (@customerId, @orderId, 388, 4)
SET @orderId = NewId()
SELECT @customerId = CustomerId FROM Customers WHERE LastName =
'Harui' and FirstName = 'Roger'
INSERT INTO Orders (CustomerId, OrderId, OrderDate)
VALUES (@customerId, @orderId, GetDate())
INSERT INTO OrderItems (CustomerID, OrderID, ProductID, Quantity)
VALUES (@customerId, @orderId, 389, 2)
SET @orderId = NewId()
SELECT @customerId = CustomerId FROM Customers WHERE LastName =
'Brehm' and FirstName = 'Peter'
INSERT INTO Orders (CustomerId, OrderId, OrderDate)
VALUES (@customerId, @orderId, GetDate())
INSERT INTO OrderItems (CustomerID, OrderID, ProductID, Quantity)
VALUES (@customerId, @orderId, 387, 3)
SET @orderId = NewId()
SELECT @customerId = CustomerId FROM Customers WHERE LastName =
'Pais' and FirstName = 'Wilson'
INSERT INTO Orders (CustomerId, OrderId, OrderDate)
VALUES (@customerId, @orderId, GetDate())
INSERT INTO OrderItems (CustomerID, OrderID, ProductID, Quantity)
VALUES (@customerId, @orderId, 388, 1)
GO
5. Для запуска скрипта нажмите клавишу F5.
Задача 3. Выполнение операций разбиения федерации
Одним из основных преимуществ федераций SQL Azure является то, что они обеспечивают
перераспределение данных с помощью таких команд T-SQL, как SPLIT, DROP или MERGE.
С помощью команды SPLIT строки в федеративных таблицах переносятся из одного члена
федерации в новый член федерации. В этой задаче вы можете поровну разбить данные из
федеративных таблиц по двум членам федерации.
1. Если окно SQL Server Management Studio (среда SSMS) закрыто, откройте его, выбрав
Пуск | Все программы | Microsoft SQL Server 2008 R2 | SQL Server Management
Studio, подключитесь к базе данных, созданной в предыдущей задаче, и нажмите
Создать новый запрос.
2. Чтобы поровну распределить данные между двумя членами федерации, необходимо
найти идентификатор CustomerId, расположенный в середине образца данных. Затем
с помощью этого CustomerId мы выполним операцию SPLIT и создадим два члена
федерации.
3. Запустите следующий код и скопируйте результат выполнения в Блокнот. Этот
результат будет использован в рамках этой задачи позднее.
T-SQL
USE FEDERATION Orders_Federation (CustId = '00000000-0000-00000000-000000000000') WITH RESET, FILTERING = OFF
GO
CREATE TABLE #tmp
(
Id int,
CustomerId uniqueidentifier
)
INSERT INTO #tmp (id, CustomerId)
SELECT ROW_NUMBER() OVER(ORDER BY customerid), customerid FROM
Customers ORDER BY CustomerId
DECLARE @count int
SELECT @count = COUNT(*) FROM #tmp
SELECT CustomerId FROM #tmp WHERE Id = @count / 2
4. Теперь вставьте следующий код, чтобы выполнить операцию разбиения. Выделенный
заполнитель необходимо заменить результатом, полученным в предыдущем шаге.
T-SQL
-- Шаг 2. Выполнение операции разбиения
-- Примечание. Прежде чем выполнять эту команду, замените
заполнитель результатом предыдущей операции
USE FEDERATION ROOT WITH RESET
GO
ALTER FEDERATION Orders_Federation SPLIT AT (CustId = '{Insert the
CustomerId from the above operation}')
GO
5. Для запуска скрипта нажмите клавишу F5.
Проверка
Чтобы проверить результаты задач, которые уже были выполнены, необходимо сформировать
запрос к созданным таблицам и убедиться в том, что они действительно были созданы
и заполнены данными. Кроме того, вы проверите разделение данных по двум членам
федерации. И наконец, вы выполните запрос к метаданным федерации для проверки данных
членов федерации.
1. Если окно SQL Server Management Studio (среда SSMS) закрыто, откройте его, выбрав
Пуск | Все программы | Microsoft SQL Server 2008 R2 | SQL Server Management Studio,
подключитесь к базе данных, созданной в предыдущей задаче, и нажмите Создать
новый запрос.
2. Вставьте и выполните следующий код. Вы, например, увидите, что результирующий
набор Customer показывает только некоторых из клиентов, вставленных в таблицу.
Дело в том, что вы получаете только данные, принадлежащие первому члену
федерации. То же самое относится к таблицам Orders и OrderItems. Также отметим,
что для таблицы Products выдаются все данные. Причина в том, что таблица Products
не является федеративной, это ссылочная таблица. Каждый член федерации содержит
копию ссылочных таблиц.
T-SQL
-- Подключение к первой федерации
USE FEDERATION Orders_Federation (CustId = '00000000-0000-00000000-000000000000') WITH RESET, FILTERING = OFF
GO
SELECT * FROM Customers
GO
SELECT * FROM Orders
GO
SELECT * FROM OrderItems
GO
SELECT * FROM Products
GO
Рис. 2
Проверка значений, которые хранятся в члене федерации
3. Аналогичным образом вставьте и выполните следующий код. Имейте в виду, что
необходимо будет заменить выделенный заполнитель идентификатором клиента
CustomerId, полученным в шаге 3 задачи 3. В данном случае вы будете подключаться
ко второму члену федерации, созданному в предыдущей задаче. Обратите внимание,
что теперь отображаются остальные клиенты, а также остальные заказы и позиции
заказов. Дело в том, что теперь вы получаете данные из другого члена федерации.
Также обратите внимание и на то, что выдаются все товары.
T-SQL
-- Подключение ко второй федерации
-- Примечание. Замените заполнитель идентификатором клиента
CustomerId, полученным в шаге 3 задачи 3
USE FEDERATION Orders_Federation (CustId = '{Replace with the
CustomerId Obtained in Task 3 step 3}') WITH RESET, FILTERING = OFF
GO
SELECT * FROM Customers
GO
SELECT * FROM Orders
GO
SELECT * FROM OrderItems
GO
SELECT * FROM Products
GO
Рис. 3
Проверка значений конкретного ключа федерации
4. В этом шаге вы еще раз подключитесь ко второму члену федерации, но на этот раз
зададите для параметра Filtering значение ON. Таким образом вы показываете, что
хотите подключиться к члену федерации, где находится указанный идентификатор
клиента CustomerId, и вам нужны только данные по этому CustomerId. Вставьте и
выполните следующий код. Имейте в виду, что необходимо будет заменить
выделенный заполнитель идентификатором клиента CustomerId, полученным в шаге 3
задачи 3. Вы увидите, что выдаются данные только для конкретного идентификатора
CustomerId.
T-SQL
-- Подключение ко второму члену федерации с параметром Filtering =
ON
-- Примечание. Замените заполнитель идентификатором клиента
CustomerId, полученным в шаге 3 задачи 3
USE FEDERATION Orders_Federation (CustId = '{Replace with the
CustomerId Obtained in Task 3 step 3}') WITH RESET, FILTERING = ON
GO
SELECT * FROM Customers
GO
SELECT * FROM Orders
GO
SELECT * FROM OrderItems
GO
SELECT * FROM Products
GO
Рис. 4
Проверка значений конкретного ключа федерации с параметром Filtering=ON
5. И наконец, вы выполните запрос к метаданным федерации. Вставьте и выполните
следующий код. Вы получите метаданные федерации (которые хранятся в системном
представлении Sys.Federations) и всех членов федерации (которые хранятся
в системном представлении Sys.federation_member_distributions).
T-SQL
-- Запрос метаданных федерации
USE FEDERATION ROOT WITH RESET
GO
-- Федерация
SELECT * FROM sys.Federations
GO
-- Члены федерации
SELECT * FROM sys.federation_member_distributions
GO
Рис. 5
Запрос метаданных
6. Закройте окно SQL Server Management Studio (среда SSMS).
Упражнение 2. Работа с федеративными таблицами из ADO.NET
В этом упражнении вы узнаете, как разрабатывать приложения, взаимодействующие с
федеративными таблицами с помощью ADO.NET.
Задача 1. Добавление кода для запросов к федеративным таблицам
В этой задаче вы добавите в приложение логику для запросов к федеративным и ссылочным
таблицам.
1. Откройте Visual Studio от имени администратора, выбрав Пуск | Все программы |
Microsoft Visual Studio 2010, щелкнув правой кнопкой мыши значок Microsoft Visual
Studio 2010 и выбрав команду Запуск от имени администратора.
2. В меню Файл выберите пункт Открыть, затем щелкните Проект/Решение.
3. В диалоговом окне Открытие проекта перейдите в папку Source\Ex02WorkingWithFederatedTablesFromADO.NET\Begin, выберите в ней файл
FederationsWithEF.sln и нажмите кнопку Открыть.
Рис. 6
Решение Begin
4. Сделайте FederationsWithAdoNet проектом, запускаемым автоматически, щелкнув
его правой кнопкой мыши в обозревателе решений и выбрав команду Назначить
запускаемым автоматически проектом.
Рис. 7
Назначение запускаемого автоматически проекта
5. Обновите определение службы, чтобы задать параметры конфигурации, необходимые
для доступа к серверу SQL Azure. Для этого разверните папку Roles проекта
FederationsWithAdoNet в обозревателе решений, щелкните правой кнопкой
мыши проект FederationsWithAdoNet.Web и выберите пункт Свойства.
.
Рис. 8
Запуск редактора конфигурации службы
6. Перейдите на вкладку Параметры, найдите параметр DataConnectionString и обновите
заполнители в поле Значение настройками сервера, созданными в разделе Установка
этой практической работы.
Рис. 9
Запуск редактора конфигурации службы
7. Откройте файл FederationDb.cs, расположенный в папке Models.
8. Добавьте выделенный код, чтобы задать имя федерации и имя распределения для
федерации.
(Фрагмент кода ― SQL Azure Federation ― Ex2 AddingFederationAndDistributionName― CS)
C#
public class FederationDb
{
private const string FederationName = "Orders_Federation";
private const string DistributionName = "CustId";
private readonly string _connectionString;
...
}
9. Теперь добавьте следующий метод в конец класса. Этот метод возвращает инструкцию
USE, необходимую для выполнения запросов к соответствующему члену федерации.
(Фрагмент кода ― SQL Azure Federation ― Ex2 GetUseFederationStatement― CS)
C#
private string GetUseFederationStatement(string federationName,
string distributionName, Guid customerId, bool filteringOn)
{
return distributionName.ToUpper().CompareTo("ROOT") == 0
? "USE FEDERATION ROOT WITH RESET"
: string.Format("USE FEDERATION {0} ({1}='{2}') WITH RESET,
FILTERING = {3}", federationName, distributionName, customerId,
(filteringOn ? "ON" : "OFF"));
}
10. Измените метод GetDataSet для выполнения пользовательской команды USE
FEDERATION перед каждым запросом. Замените весь метод следующим кодом.
(Фрагмент кода ― SQL Azure Federation ― Ex2 GetDataSet― CS)
C#
private DataSet GetDataSet(string federationName, string
distributionName, Guid customerId, bool filteringOn, string strSql,
params SqlParameter[] parameters)
{
DataSet dataToReturn = null;
using (var temp = new DataSet())
{
var useFederationCommandText =
this.GetUseFederationStatement(federationName, distributionName,
customerId, filteringOn);
using (var connection = new
SqlConnection(this.connectionString))
{
connection.Open();
using (var command =
connection.CreateCommand())
{
command.CommandText =
useFederationCommandText;
command.ExecuteNonQuery();
}
using (var dataAdapter = new SqlDataAdapter())
{
using (var command = new SqlCommand())
{
foreach (var param in parameters)
{
command.Parameters.Add(param);
}
command.Connection = connection;
command.CommandText = strSql;
dataAdapter.SelectCommand = command;
dataAdapter.Fill(temp);
}
}
}
dataToReturn = temp;
}
return dataToReturn;
}
11. Для получения одного заказа из базы данных с федерациями необходимо сначала
найти член федерации, в котором находится нужный заказ. Для этого необходимо
расположить инструкцию USE FEDERATION перед запросом SELECT с определенным
идентификатором customerId и атрибутом FILTERING со значением ON, чтобы
получить все заказы этого конкретного клиента. Обратите внимание, что не нужно
даже указывать идентификатор customerId в предложении WHERE. Это единственная
разница между запросом к стандартной базе данных и базе данных с федерациями.
В методе GetOrderById замените следующую строку выделенным кодом.
(Фрагмент кода ― SQL Azure Federation ― Ex2 GetOrderById― CS)
C#
public Order GetOrderById(Guid customerId, Guid orderId)
{
var order = new Order();
var orders = this.GetDataSet(FederationName, DistributionName,
customerId, true, "select * from Orders O join OrderItems OI on
O.OrderId = OI.OrderId where O.OrderId = @orderId", new
SqlParameter("@orderId", orderId)
);
if (orders.Tables.Count > 0)
{
...
}
12. Теперь замените выделенный код в методе GetCustomerById. На этот раз предложение
WHERE не требуется, потому что это задание выполняется в рамках инструкции USE
FEDERATION. Достаточно указать идентификатор customerId и задать для атрибута
FILTERING значение ON.
(Фрагмент кода ― SQL Azure Federation ― Ex2 GetCustomerById― CS)
C#
public Customer GetCustomerById(Guid customerId)
{
var customer = new Customer();
var customers = this.GetDataSet(FederationName,
DistributionName, customerId, true, "select * from Customers");
if (customers.Tables.Count > 0)
{
...
}
13. И наконец, вам необходимо получить товары из базы данных с федерациями. Для
этого замените выделенную строку в методе GetProductById. Обратите внимание,
что мы всегда запрашиваем данные из первого члена федерации. Причина в том, что
таблица Products не является федеративной. Ссылочные таблицы реплицируются во
всех членах федерации и обновляются при каждом изменении. Поэтому не нужно
указывать конкретный член федерации для получения определенного товара.
(Фрагмент кода ― SQL Azure Federation ― Ex2 GetProductById― CS)
C#
public Product GetProductById(int productId)
{
var product = new Product();
var products = this.GetDataSet(FederationName,
DistributionName, Guid.Empty, false, "select * from products where
ProductId = @productId", new SqlParameter("@productId", productId);
if (products.Tables.Count > 0)
{
...
}
14. Таким же образом замените выделенный код в методе GetAllProducts.
(Фрагмент кода ― SQL Azure Federation ― Ex2 GetAllProducts― CS)
C#
public List<Product> GetAllProducts()
{
// нефедеративная таблица
var listProducts = new List<Product>();
var products = this.GetDataSet(FederationName,
DistributionName, Guid.Empty, false, "select * from products");
if (products.Tables.Count > 0)
{
...
}
15. Нажмите клавиши CTRL+S , чтобы сохранить изменения.
Задача 2. Добавление кода для выполнения операций CRUD с федеративной таблицей
Как и с операциями SELECT, для выполнения операций CRUD с федеративной базой данных
достаточно внести одно изменение — добавить инструкцию USE FEDERATION, чтобы направить
запрос нужному члену федерации. В этой задаче вы вносите необходимые изменения
в приложение для добавления, обновления и удаления заказа в базе данных с федерациями.
1. Если файл FederationDb.cs, находящийся в папке Models, еще не открыт, откройте его.
2. Вы должны указать член федерации, в который хотите добавить заказ. Добавьте
инструкцию USE FEDERATION и задайте идентификатор customerId из диапазона
члена федерации. Для этого найдите метод InsertOrder и добавьте в его начало
следующий код.
(Фрагмент кода ― SQL Azure Federation ― Ex2 InsertOrder ― CS)
C#
private void InsertOrder(Order order)
{
var useFederationSatatement =
this.GetUseFederationStatement(FederationName, DistributionName,
order.CustomerId, true);
var insertOrderStatement = "INSERT INTO ORDERS (CustomerId,
OrderId, OrderDate) VALUES (@customerId, @orderId, @orderDate)";
...
}
3. Добавьте следующий код для выполнения инструкции USE FEDERATION после установки
соединения с сервером.
(Фрагмент кода ― SQL Azure Federation ― Ex2 InsertOrderUseFederatedConnection― CS)
C#
private void InsertOrder(Order order)
{
...
using (var connection = new
SqlConnection(this.connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = useFederationSatatement;
command.ExecuteNonQuery();
}
...
}
4. Таким же образом вы должны указать член федерации, где находится обновляемый
заказ. Добавьте следующий код в начало метода UpdateOrder.
(Фрагмент кода ― SQL Azure Federation ― Ex2 UpdateOrder― CS)
C#
private void UpdateOrder(Order order)
{
var useFederationSatatement =
this.GetUseFederationStatement(FederationName, DistributionName,
order.CustomerId, true);
var updateOrderStatement = "UPDATE ORDERS SET OrderDate =
@orderDate WHERE OrderId = @orderId";
...
}
5. Добавьте следующий код для выполнения инструкции USE FEDERATION после
установки соединения.
(Фрагмент кода ― SQL Azure Federation ― Ex2 UpdateOrderConnection― CS)
C#
private void UpdateOrder(Order order)
{
...
using (var connection = new SqlConnection(this.connection
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = useFederationSatatement;
command.ExecuteNonQuery();
}
...
}
6. И наконец, добавьте следующий код в метод DeleteOrder.
(Фрагмент кода ― SQL Azure Federation ― Ex2 DeleteOrder― CS)
C#
public void DeleteOrder(Guid customerId, Guid orderId)
{
var useFederationSatatement =
this.GetUseFederationStatement(FederationName, DistributionName,
customerId, true);
...
}
7. Добавьте следующий код для выполнения инструкции USE FEDERATION после
установки соединения.
(Фрагмент кода ― SQL Azure Federation ― Ex2 DeleteOrderConnection― CS)
C#
private void DeleteOrder(Order order)
{
...
using (var connection = new
SqlConnection(this.connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = useFederationSatatement;
command.ExecuteNonQuery();
}
...
}
8.
Нажмите клавиши CTRL+S, чтобы сохранить изменения.
Задача 3. Добавление кода для выполнения всеобъемлющих запросов
Члены федерации — это базы данных, которые управляются системой и обеспечивают
вычислительные мощности для части данных федерации. Приложение, использующее базу
данных с федерацией, должно учитывать, что получение всех элементов из федеративной
таблицы может создать всеобъемлющий запрос, когда запрашиваются данные из нескольких
баз данных. В этой задаче вы добавите логику для получения всех данных из базы данных
с федерациями.
1. Если файл FederationDb.cs, находящийся в папке Models, еще не открыт, откройте его.
2. Вставьте следующий код в метод FanOut. Этот метод будет вызываться внутри
методов GetAllCustomers и GetAllOrders.
(Фрагмент кода ― SQL Azure Federation ― Ex2 FanOut― CS)
C#
private DataSet FanOut(string sqlCommand)
{
Guid? federatedKey = Guid.Empty;
DataSet dataToReturn = null;
var sqlCommandText = sqlCommand;
using (var tempData = new DataSet())
{
do
{
using (var data = new DataSet())
{
using (var connection = new
SqlConnection(this.connectionString))
{
connection.Open();
/ / Маршрут соединения к заданному члену
федерации
using (var command =
connection.CreateCommand())
{
command.CommandText =
this.GetUseFederationStatement(FederationName, DistributionName,
(Guid)federatedKey, false);
command.ExecuteNonQuery();
// Возвращает DataSet
using (var dataAdapter = new
SqlDataAdapter(sqlCommandText, connection))
{
dataAdapter.Fill(data);
}
// Слияние данных во временный набор данных
tempData.Merge(data);
// Получение следующего высокого значения
диапазона из метаданных
command.CommandText = "SELECT
CAST(range_high as uniqueidentifier) FROM
sys.federation_member_distributions";
var nextRange = command.ExecuteScalar();
if (nextRange == DBNull.Value)
{
federatedKey = null;
}
else
{
federatedKey =
Guid.Parse(nextRange.ToString());
}
}
}
}
}
while (federatedKey != null);
dataToReturn = tempData;
}
return dataToReturn;
}
3. Нажмите клавиши CTRL+S, чтобы сохранить изменения.
Проверка
Теперь вы должны запустить приложение в эмуляторе вычислений для проверки
функциональности с учетом изменений, которые были внесены для указания целевой базы
данных с федерациями.
1. Для запуска приложения в локальном эмуляторе нажмите клавишу F5 в среде Visual
Studio.
2. В браузере откроется страница приложения по умолчанию. На этой странице будут
отображены заказы всех клиентов.
Рис. 10
Домашняя страница практической работы по федерациям SQL Azure
3. Щелкните Создать новый заказ. Вы будете перенаправлены на страницу Создание
заказа.
4. Нажмите Добавить позицию и добавьте в заказ две новые позиции: 5 модулей
Fusion Generator Module 5 kV и 7 кронштейнов Titanium Extension Bracket Right Hand.
Рис. 11
Добавление позиций заказа в новый заказ
5. Нажмите кнопку Создать для сохранения нового заказа. Новый заказ должен
появиться в списке заказов.
Рис. 12
Отображение списка заказов
6. Теперь найдите заказ, созданный в предыдущем шаге, и нажмите кнопку Изменить.
Вы будете перенаправлены на страницу Изменение заказа. Удалите последнюю
позицию заказа и нажмите кнопку Сохранить.
Рис. 13
Изменение заказа
7. После этого заказ останется в списке заказов, но на этот раз только с одной позицией.
Теперь нажмите кнопку Удалить, чтобы удалить заказ из базы данных.
Рис. 14
Удаление заказа
8. Закройте браузер.
Упражнение 3. Работа с федеративными таблицами с помощью Entity
Framework
В этом упражнении вы узнаете, как разрабатывать приложения, взаимодействующие
с федеративными таблицами, с помощью ADO.NET Entity Framework.
Задача 1. Добавление кода для запросов к федеративным таблицам
Как и в предыдущем упражнении, перед каждым запросом необходимо выполнить
инструкцию USE FEDERATION для указания целевого члена федерации. В этой задаче вы
добавите в приложение логику для запроса данных из разных таблиц, содержащихся в базе
данных с федерациями, с помощью Entity Framework.
1. Откройте Visual Studio от имени администратора, выбрав Пуск | Все программы |
Microsoft Visual Studio 2010, щелкнув правой кнопкой мыши значок Microsoft Visual
Studio 2010 и выбрав команду Запуск от имени администратора.
2. В меню Файл выберите пункт Открыть, затем щелкните Проект/Решение.
3. В диалоговом окне Открытие проекта перейдите в папку Source\Ex03WorkingWithFederatedTablesWithEntityFramework\Begin, выберите в ней файл
FederationsWithEF.sln и нажмите кнопку Открыть.
Рис. 15
Решение Begin
4. Сделайте FederationsWithEF запускаемым автоматически проектом, щелкнув его
правой кнопкой мыши в обозревателе решений и выбрав Назначить запускаемым
автоматически проектом.
Рис. 16
Назначение запускаемого автоматически проекта
5. Обновите определение службы, чтобы задать параметры конфигурации,
необходимые для доступа к серверу SQL Azure. Для этого разверните папку Roles
проекта FederationsWithEF в обозревателе решений, щелкните правой кнопкой
мыши FederationsWithEF.Web и выберите пункт Свойства.
Рис. 17
Запуск редактора конфигурации службы
6. Перейдите на вкладку Параметры, найдите параметр DataConnectionString и обновите
заполнители в поле Значение настройками сервера, созданными в разделе Установка
этой практической работы.
Рис. 18
Запуск редактора конфигурации службы
7. Откройте файл FederationDb.cs, находящийся в папке Models.
8. Добавьте выделенный код, чтобы задать имя федерации и имя распределения для
базы данных с федерациями.
(Фрагмент кода ― SQL Azure Federation ― Ex3 FederationDbConstants ― CS)
C#
public class FederationDb
{
private const string FederationName = "Orders_Federation";
private const string DistributionName = "CustId";
private readonly string connectionString;
...
}
9. Теперь добавьте следующий метод в конец класса, чтобы получить пользовательскую
инструкцию USE FEDERATION, которая позволяет выполнять запросы к любой базе
данных с федерациями.
(Фрагмент кода ― SQL Azure Federation ― Ex3 FederationDbFedStatement ― CS)
C#
public class FederationDb
{
...
private string GetUseFederationStatement(string federationName,
string distributionName, Guid customerId, bool filteringOn)
{
return distributionName.ToUpper().CompareTo("ROOT") == 0
? "USE FEDERATION ROOT WITH RESET"
: string.Format("USE FEDERATION {0} ({1}='{2}') WITH
RESET, FILTERING = {3}",
federationName, distributionName, customerId,
(filteringOn ? "ON" : "OFF"));
}
}
10. Найдите метод GetOrderById и добавьте выделенную строку кода, чтобы задать
команду USE FEDERATION, которая будет выполняться до запроса.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetOrderByIdUseFedCmd― CS)
C#
public Order GetOrderById(Guid customerId, Guid orderId)
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
customerId, true);
var order = new Order();
using (var context = new SalesEntities(this.connectionString))
{
...
}
11. Теперь добавьте код для выполнения SqlCommand.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetOrderByIdConnOpen― CS)
C#
public Order GetOrderById(Guid customerId, Guid orderId)
{
...
using (var context = new SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationCommand);
order = context.Orders.Single(o => o.OrderId == orderId);
}
return order;
}
12. Повторите те же шаги в методе GetCustomerById. Сначала добавьте выделенную
строку кода в начало метода.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetCustomerByIdUseFedCmd― CS)
C#
public Customer GetCustomerById(Guid customerId)
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
customerId, true);
var customer = new Customer();
...
}
13. Добавьте следующий код в блок using.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetCustomerByIdConnOpen― CS)
C#
public Customer GetCustomerById(Guid customerId)
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
customerId, true);
var customer = new Customer();
using (var context = new SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationCommand);
customer = context.Customers.Single(o => o.CustomerId ==
customerId);
}
return customer;
}
14. И наконец, вам необходимо получить товары из базы данных с федерациями.
Для этого добавьте выделенную строку в метод GetProductById. Обратите
внимание, что для извлечения товаров не нужно указывать член федерации,
так как таблица Products не является федеративной.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetProductByIdUseFedCmd― CS)
C#
public Product GetProductById(int productId)
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
Guid.Empty, true);
var product = new Product();
...
15. Добавьте следующую строку в блок using до запроса для получения одного товара.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetProductByIdConnOpen― CS)
C#
public Product GetProductById(int productId)
{
...
using (var context = new SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationCommand);
product = context.Products.Single(p => p.ProductId ==
productId);
}
return product;
}
16. Таким же образом добавьте выделенный код в начало метода GetAllProducts.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetAllProductsUseFedCmd― CS)
C#
public List<Product> GetAllProducts()
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
Guid.Empty, true);
var list = new List<Product>();
...
}
17. Добавьте выделенный код в блок using.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetAllProductsConnOpen― CS)
C#
public List<Product> GetAllProducts()
{
...
using (var context = new SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationCommand);
list = context.Products.ToList();
}
return list;
}
18. Нажмите клавиши CTRL+S , чтобы сохранить изменения.
Задача 2. Добавление кода для выполнения операций CRUD с федеративной таблицей
Как и в случае запроса данных, единственная разница между выполнением операции CRUD
в простой базе данных и базе данных с федерациями — это добавление инструкции USE
FEDERATION. В этой задаче вы вносите необходимые изменения в приложение для добавления,
обновления и удаления заказа в базе данных с федерациями с помощью Entity Framework.
1. Если файл FederationDb.cs, находящийся в папке Models, еще не открыт, откройте его.
2. Найдите метод SaveOrder. Этот метод используется для добавления или обновления
данных. Для операции Insert или Update необходимо выполнить инструкцию USE
FEDERATION, чтобы указать член федерации, с которым вы собираетесь работать.
Для этого найдите метод SaveOrder и добавьте следующую строку кода в его начало.
(Фрагмент кода ― SQL Azure Federation ― Ex3 SaveOrderUseFedCmd― CS)
C#
public void SaveOrder(Order order)
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
order.CustomerId, true);
...
}
3. Добавьте следующий код в блок using для выполнения команды.
(Фрагмент кода ― SQL Azure Federation ― Ex3 SaveOrderConnOpen― CS)
C#
public void SaveOrder(Order order)
{
...
using (var context = new SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationCommand);
...
}
}
4. То же самое необходимо сделать для метода DeleteOrder. Добавьте выделенный код
в начало метода.
(Фрагмент кода ― SQL Azure Federation ― Ex3 DeleteOrderUseFedCmd― CS)
C#
public void DeletedOrder(Order order)
{
var useFederationCommand =
GetUseFederationStatement(FederationName, DistributionName,
order.CustomerId, true);
...
}
5. Теперь добавьте выделенный код в инструкцию блока using.
(Фрагмент кода ― SQL Azure Federation ― Ex3 DeleteOrderConnOpen― CS)
C#
public void DeletedOrder(Order order)
{
...
using (var context = new SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationCommand);
context.Orders.Attach(order);
context.Orders.Remove(order);
context.SaveChanges();
}
}
6. Нажмите клавиши CTRL+S, чтобы сохранить изменения.
Задача 3. Добавление кода для выполнения всеобъемлющего запроса
Члены федерации — это базы данных, которые управляются системой и обеспечивают
вычислительные мощности для части данных федерации. Приложение, использующее базу
данных с федерацией, должно учитывать, что извлечение всех элементов из федеративной
таблицы может создать всеобъемлющий запрос, когда запрашиваются данные из нескольких
баз данных. В этой задаче вы добавите логику для получения всех данных из федеративных
таблиц.
1. Если файл FederationDb.cs, находящийся в папке Models, еще не открыт, откройте его.
2. Для получения всех заказов, которые хранятся в базе данных, необходимо
просмотреть все члены федерации в режиме итерации и получить заказы,
находящиеся внутри каждого из них. Для этого замените код в методе GetAllOrders
следующим кодом. Обратите особое внимание на то, как мы получаем ключ
федерации для указания каждого члена федерации. Для этого необходимо
запросить значение maxRange текущего члена федерации из системного
представления sys.federation_member_distributions, так как это то значение,
которое хранится в первой строке следующего члена федерации.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetAllOrders― CS)
C#
public List<Order> GetAllOrders()
{
var list = new List<Order>();
Guid? federationKey = Guid.Empty;
do
{
var useFederationStatement =
GetUseFederationStatement(FederationName, DistributionName,
(Guid)federationKey, false);
using (var context = new
SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationStatement);
var auxList =
context.Orders.Include("OrderItems").ToList();
list.AddRange(auxList);
var maxRange = context.Database.SqlQuery<Guid?>("SELECT
CAST(range_high as uniqueidentifier) FROM
sys.federation_member_distributions").FirstOrDefault();
federationKey = (maxRange == null) ? null : maxRange;
}
} while (federationKey != null);
return list;
}
3. Таким же образом вставьте следующий код для метода GetAllCustomers.
(Фрагмент кода ― SQL Azure Federation ― Ex3 GetAllCustomers― CS)
C#
public List<Customer> GetAllCustomers()
{
var list = new List<Customer>();
Guid? federationKey = Guid.Empty;
do
{
var useFederationStatement =
GetUseFederationStatement(FederationName, DistributionName,
(Guid)federationKey, false);
using (var context = new
SalesEntities(this.connectionString))
{
((IObjectContextAdapter)context).ObjectContext.Connection.Open();
context.Database.ExecuteSqlCommand(useFederationStatement);
var auxList = context.Customers.ToList();
list.AddRange(auxList);
var maxRange = context.Database.SqlQuery<Guid?>("SELECT
CAST(range_high as uniqueidentifier) FROM
sys.federation_member_distributions").FirstOrDefault();
federationKey = (maxRange == null) ? null : maxRange;
}
} while (federationKey != null);
return list;
}
4. Нажмите клавиши CTRL+S, чтобы сохранить изменения.
Проверка
Теперь вы должны запустить приложение в эмуляторе вычислений для проверки
функциональности с учетом изменений, которые были внесены для указания целевой базы
данных с федерациями.
1. Для запуска приложения в локальном эмуляторе нажмите клавишу F5 в среде Visual
Studio.
2. В браузере откроется страница приложения по умолчанию. На этой странице
отображаются заказы всех клиентов.
Рис. 19
Домашняя страница практической работы по федерациям SQL Azure
3. Щелкните Создать новый заказ. Вы будете перенаправлены на страницу Создание
заказа.
4. Нажмите кнопку Добавить позицию и добавьте в заказ две новые позиции: 5 модулей
Fusion Generator Module 5 kV и 7 кронштейнов Titanium Extension Bracket Right Hand.
Рис. 20
Добавление позиций заказа в новый заказ
5. Нажмите кнопку Создать для сохранения нового заказа. Новый заказ должен
появиться в списке заказов.
Рис. 21
Отображение списка заказов
6. Теперь найдите заказ, созданный в предыдущем шаге, и нажмите кнопку Изменить.
Вы будете перенаправлены на страницу Изменение заказа. Удалите последнюю
позицию заказа и нажмите кнопку Сохранить.
Рис. 22
Изменение заказа
7. После этого заказ останется в списке заказов, но на этот раз только с одной позицией.
Теперь нажмите кнопку Удалить, чтобы удалить заказ из базы данных.
Рис. 23
Удаление заказа
8. Закройте браузер.
Сводка
Выполнив эту практическую работу, вы узнали, как задать сегментирование базы данных с
помощью федераций SQL Azure и как работать с федеративными таблицами из ADO.NET и
Entity Framework.
Download