Редакция #22

Вы просматриваете более старую редакцию этой страницы.
Перейти к текущей версии

В этом пошаговом руководстве демонстрируется как работать с федерациями в SQL Azure и как выполнять запросы к члену федерации из приложения основанном на Entity Framework Code First.

 

В этом руководстве содержатся следующие подразделы.

выполнения этого пошагового руководства потребуется

  • Установить Visual Studio 11 Beta. Подробнее на эту тему см. Установите Visual Studio 11 Beta.
  • Установить последнюю версию Entity Framework.  Шаги установки будут приведены ниже.

Overview

В этом пошаговом руководстве мы покажем, следующий сценарий в качестве примера. Существует университет, который имеет отделы (Department(s)), курсы (Course(s)) и студентов (Student(s)). Студенты могут быть зачислены в один или несколько курсов (Enrollment(s)).

Данные в таблицах Student и Enrollment существенно растут, так что эти данные мы захотим разделить между более чем одним членом федерации. Такие таблицы называются федеративными таблицами. Они должны содержать столбец связанный с ключом распределения федерации. Федеративная таблица создается с использованием предложения FEDERATE ON.

Данные в таблицах Department и Course не вырастет значительно, так что нет необходимости их данные разделять между федерациями. Эти таблицы будут ссылочными таблицами. Ссылочная таблица — это таблица в рамках федерации, созданная без предложения FEDERATE ON и не имеющая специальной связи с ключом распределения федерации.  

У федерации может быть только одна схема и только один ключ распределения. В этом примере, имеет смысл выбрать SID в качестве ключа распределения и связать столбец StudentID с этим ключом.

 

На следующем рисунке показана схема University.

 

 

 

Подключение к серверу SQL Azure

В этом пошаговом руководстве вы будете использовать среду Visual Studio 11 Beta для разработки запросов и управления ими в SQL Server. В частности, вы будете использовать SQL Server Object Explorer и T-SQL Editor.  

Обратите внимание: Если вы ничего не делаете в о не T-SQL Editor в течение некоторого времени, подключение к базе данных может истечь, и вы получите сообщение об ошибке. В этом случае щелкните правой кнопкой мыши в T-SQL Editor и выберите Connection -> Connect …..

  1. Откройте Visual Studio 11 Beta. 
  2. Выберите View -> SQL Server Object Explorer меню.
  3. В SQL Server Object Explorer панели,  нажмите на кнопку Auto Hide (в верхнем правом углу).
  4. В SQL Server Object Explorer панели, щелкните правой кнопкой мыши на SQL Server и выберите Add SQL Server ... Убедитесь в том, что выбран метод проверки SQL Server Authentication.
  5. Нажмите кнопку Connect.

Создание корневой базы данных федерации

Для создания федерации, необходимо сначала создать корневую базу данных федерации. Чтобы создать корневую базу данных федерации, необходимо сначала установить соединение с базой данных master в SQL Azure Server.

  1. В панели SQL Server Object Explorer, разверните узел Datatabases. Затем, разверните узел System Databases и щелкните master.
  2. Щелкните правой кнопкой мыши на узле master и выберите New Query. T-SQL Editor вызывается и подключается к серверу. 
  3. В окне T-SQL Editor вставьте следующий T-SQL.
    CREATE DATABASE [School] 
    (EDITION='Web', MAXSIZE=1GB) 
    GO
  4. Щелкните правой кнопкой мыши в T-SQL editor и выберите Execute.
  5. В панели SQL Server Object Explorer, щелкните правой кнопкой мыши на Databases, а затем щелкните Refresh. Новая база данных School появилась в списке.
  6. Закройте окно T-SQL Editor.

Создание федерации и схемы федерации

Федерация представляет собой коллекцию секций базы данных, определяемых схемой распределения федерации, которая называется схемой фе��ерации. Схема федерации определяет ключ распределения федерации, от которого зависит распределение данных по секциям федерации. Ключ распределения федерации должен иметь тип INT, BIGINT, UNIQUEIDENTIFIER или VARBINARY (до 900 байт), он указывает значение диапазона. У федерации может быть только одна схема и только один ключ распределения. Подробнее на эту тему см. Федерации в SQL Azure (база данных SQL Azure).

  1. Щелкните правой кнопкой мыши на узле School и выберите New Query. T-SQL Editor вызывается и подключается к серверу.
  2. Федерации создаются с помощью инструкции CREATE FEDERATION (база данных SQL Azure), которая создает корень федерации и исходный член федерации. Скопируйте следующую инструкцию в окно T-SQL Editor:  
    CREATE FEDERATION StudentFederation(SID INT RANGE)
    GO
  3. Щелкните правой кнопкой мыши в T-SQL editor и выберите Execute.  
  4. В панели SQL Server Object Explorer, щелкните правой кнопкой мыши на Databases, а затем щелкните Refresh.

Вы увидите новую базу данных с именем, которое начинается с system-. При создании федерации, создаются объекты федерации, в том числе база данных начального члена федерации.

Создание и заполнение таблицы в федерации

В этом разделе показано как создаются федеративные и ссылочные таблицы. Федеративная таблица создается с использованием инструкции FEDERATE ON и содержит столбец связанный с ключом распределения федерации.

  1. В окне T-SQL Editor удалите весь текст.
  2. Чтобы создать таблицы федерации надо сначала подключится к корню федерации с помощью инструкции USE FEDERATION (база данных SQL Azure), а затем использовать инструкцию CREATE TABLE (база данных SQL Azure). Скопируйте следующие инструкции в окно T-SQL Editor:
    USE FEDERATION StudentFederation (SID = 0) WITH RESET, FILTERING = OFF
    GO
  3. Щелкните правой кнопкой мыши в T-SQL editor и выберите Execute
  4. В окне T-SQL Editor удалите весь текст и вставьте следующий T-SQL который определяет таблицы (федеративные и ссылочные) и их связи. 
    -- Create the Department table.
    BEGIN
    CREATE TABLE [dbo].[Department](
     [DepartmentID] [int] NOT NULL,
     [Name] [nvarchar](50) NOT NULL,
     [Budget] [money] NOT NULL,
     [StartDate] [datetime] NOT NULL
    CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED
    (
     [DepartmentID] ASC
    )WITH (IGNORE_DUP_KEY = OFF)
    )
    END
    GO
      
      
    -- Create the Student table.
    BEGIN
    CREATE TABLE [dbo].[Student](
     [StudentID] [int] NOT NULL,
     [LastName] [nvarchar](50) NOT NULL,
     [FirstName] [nvarchar](50) NOT NULL,
     [EnrollmentDate] [datetime] NULL,
    CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
    (
     [StudentID] ASC
    ) WITH (IGNORE_DUP_KEY = OFF)
    )
    FEDERATED ON (SID=[StudentID])
    END
    GO
      
    --Create the Enrollment table.
    BEGIN
    CREATE TABLE [dbo].[Enrollment](
     [EnrollmentID] [int] NOT NULL,
     [StudentID] [int] NOT NULL,
     [CourseID] [int] NOT NULL,
     [Grade] [decimal](3, 2) NULL,
     CONSTRAINT [PK_Enrollment] PRIMARY KEY CLUSTERED 
     
     [EnrollmentID] ASC
     [StudentID] ASC
    )WITH (IGNORE_DUP_KEY = OFF
    FEDERATED ON (SID = [StudentID])
    END
     
    GO
     
    -- Create the Course table.
    BEGIN
    CREATE TABLE [dbo].[Course](
     [CourseID] [int] NOT NULL,
     [Title] [nvarchar](100) NOT NULL,
     [Credits] [int] NOT NULL,
     [DepartmentID] [int] NOT NULL,
     CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED
    (
     [CourseID] ASC
    )WITH (IGNORE_DUP_KEY = OFF)
    )
    END
    GO
      
    -- Define the relationship between Enrollment and Course.
    ALTER TABLE [dbo].[Enrollment]  WITH CHECK ADD
     CONSTRAINT [FK_Enrollment_Course] FOREIGN KEY([CourseID])
    REFERENCES [dbo].[Course] ([CourseID])
    GO
    ALTER TABLE [dbo].[Enrollment] CHECK
     CONSTRAINT [FK_Enrollment_Course]
    GO
      
    --Define the relationship between Enrollment and Student.
     ALTER TABLE [dbo].[Enrollment]  WITH CHECK ADD
     CONSTRAINT [FK_Enrollment_Student] FOREIGN KEY([StudentID])
     REFERENCES [dbo].[Student] ([StudentID])
     GO
     ALTER TABLE [dbo].[Enrollment] CHECK
     CONSTRAINT [FK_Enrollment_Student]
     GO
      
    -- Define the relationship between Course and Department.
     ALTER TABLE [dbo].[Course]  WITH CHECK ADD
     CONSTRAINT [FK_Course_Department] FOREIGN KEY([DepartmentID])
     REFERENCES [dbo].[Department] ([DepartmentID])
     GO
     ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Course_Department]
    GO
  5. Щелкните правой кнопкой мыши в T-SQL editor и выберите Execute
  6. В окне T-SQL Editor удалите весь текст.
  7. Вставьте некоторые данные в таблицы. Скопируйте следующие инструкции в окно T-SQL Editor:
    -- Insert data into the Department table.
    INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate)
    VALUES (1, 'Engineering', 350000.00, '2007-09-01');
    INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate)
    VALUES (2, 'English', 120000.00, '2007-09-01');
    INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate)
    VALUES (4, 'Economics', 200000.00, '2007-09-01');
    INSERT INTO dbo.Department (DepartmentID, [Name], Budget, StartDate)
    VALUES (7, 'Mathematics', 250000.00, '2007-09-01');
    GO
     
      
    -- Insert data into the Student table.
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (1, 'Abercrombie', 'Kim', '1995-03-11');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (2, 'Barzdukas', 'Gytis', '2005-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (3, 'Justice', 'Peggy', '2001-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (4, 'Fakhouri', 'Fadi', '2002-08-06');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (5, 'Harui', 'Roger', '1998-07-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (6, 'Li', 'Yan', '2002-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (7, 'Norman', 'Laura', '2003-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (8, 'Olivotto', 'Nino', '2005-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (9, 'Tang', 'Wayne', '2005-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (10, 'Alonso', 'Meredith', '2002-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (11, 'Lopez', 'Sophia', '2004-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (12, 'Browning', 'Meredith', '2000-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (13, 'Anand', 'Arturo', '2003-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (14, 'Walker', 'Alexandra', '2000-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (15, 'Powell', 'Carson', '2004-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (16, 'Jai', 'Damien', '2001-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (17, 'Carlson', 'Robyn', '2005-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (18, 'Zheng', 'Roger', '2004-02-12');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (19, 'Bryant', 'Carson', '2001-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (20, 'Suarez', 'Robyn', '2004-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (21, 'Holt', 'Roger', '2004-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (22, 'Alexander', 'Carson', '2005-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (23, 'Morgan', 'Isaiah', '2001-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (24, 'Martin', 'Randall', '2005-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (25, 'Kapoor', 'Candace', '2001-01-15');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (26, 'Rogers', 'Cody', '2002-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (27, 'Serrano', 'Stacy', '1999-06-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (28, 'White', 'Anthony', '2001-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (29, 'Griffin', 'Rachel', '2004-09-01');
    INSERT INTO dbo.Student (StudentID, LastName, FirstName, EnrollmentDate)
    VALUES (30, 'Shan', 'Alicia', '2003-09-01');
    GO
     
      
    -- Insert data into the Course table.
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (1, 'Chemistry', 4, 1);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (2, 'Physics', 4, 1);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (3, 'Calculus', 4, 7);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (4, 'Poetry', 2, 2);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (5, 'Composition', 3, 2);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (6, 'Literature', 4, 2);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (7, 'Microeconomics', 3, 4);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (8, 'Macroeconomics', 3, 4);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (9, 'Quantitative', 2, 4);
    INSERT INTO dbo.Course (CourseID, Title, Credits, DepartmentID)
    VALUES (10, 'Trigonometry', 4, 7);
    GO
      
      
    -- Insert data into the Enrollment table.
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (1, 1, 1, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (2, 2, 1, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (3, 3, 1, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (4, 4, 2, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (5, 5, 2, 2.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (6, 6, 2, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (7, 7, 3, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (8, 8, 3, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (9, 9, 3, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (10, 10, 3, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (11, 1, 4, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (12, 2, 4, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (13, 3, 4, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (14, 4, 5, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (15, 5, 5, 2.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (16, 6, 5, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (17, 7, 5, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (18, 8, 6, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (19, 9, 6, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (20, 10, 6, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (21, 10, 7, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (22, 1, 7, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (23, 2, 8, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (24, 3, 8, 3);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (25, 4, 8, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (26, 5, 9, 2.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (27, 6, 9, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (28, 7, 9, 3.5);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (29, 8, 10, 4);
    INSERT INTO dbo.Enrollment (EnrollmentID, CourseID, StudentID, Grade)
    VALUES (30, 9, 10, 3);
    GO
     
  1. Щелкните правой кнопкой мыши в T-SQL editor и выберите Execute
  2. Закройте окно T-SQL Editor.

 

Мы вставили некоторые данные, теперь мы можем азделить эти данные на члены федерации.

Выполнение операции разбиения федерации

В этом разделе показано как можно разделить федерацию на члены федерации с помощью инструкции ALTER FEDERATION (база данных SQL Azure).

Вы разобьете существующую федерацию на три новых члена федерации, и укажете от кого значения ключа распределения разделить каждый член.

  1. Щелкните правой кнопкой мыши на узле School и выберите New Query.
  2. Операция SPLIT является асинхронной, поэтому мы должны ждать завершения операции прежде чем выполнять следующие операции SPLIT. Следующий скрипт определяет stored procedure, которая ждет пока операция SPLIT завершиться. В окне T-SQL Editor удалите весь текст и вставьте следующий T-SQL.
    CREATE PROCEDURE WaitForFederationOperations
     ( @federation_name varchar(200) )
    AS
    DECLARE @i INT
    SET @i = 1 
     
     
    WHILE @i > 0
    BEGIN
     
     SELECT @i = COUNT(*) FROM SYS.dm_federation_operations
     WHERE federation_name = @federation_name
      
     WAITFOR DELAY '00:00:01'
    END
  3. Щелкните правой кнопкой мыши в T-SQL Editor и выберите Execute
  4. В окне T-SQL Editor удалите весь текст и вставьте следующий T-SQL, который разделяет федерацию на три члена федерации.
    -- Create 3 federated members using the SPLIT command
    -- Split must be run at the root database
    USE FEDERATION ROOT WITH RESET
    GO
     
     
    ALTER FEDERATION StudentFederation SPLIT AT (SID=10)
    GO
    EXEC WaitForFederationOperations 'StudentFederation'
    GO
      
    ALTER FEDERATION StudentFederation SPLIT AT (SID=20)
    GO
    EXEC WaitForFederationOperations 'StudentFederation'
    GO
  5. Щелкните правой кнопкой мыши в T-SQL Editor и выберите Execute.
  6. Закройте окно T-SQL Editor.
  7. В панели SQL Server Object Explorer, щелкните правой кнопкой мыши на Databases, а затем щелкните Refresh. Обратите внимание, появились три базы данных с новыми именами, которые начинается с system-
 
Теперь ваша федерация разбита на члены и чтобы подключится к нужному члену федерации используется инструк��ия USE FEDERATION federation_name (distribution_name = value) WITH FILTERING={ON|OFF}. Подробнее на эту тему см. USE FEDERATION.

 

Создание концептуальной модели с использованием Entity Framework Code First

В этом разделе вы создадите концептуальную модель которая соответствует схеме базы данных которую вы создали в предыдущих разделах.
  1. В Visual Studio 11 Beta выберите New Project из меню File.
  2. Выберите шаблон Console, введите имя проекта FederationsWithCodeFirst и нажмите кнопку ОК.
  3. Установитe последнюю версию Entity Framework.
  4. Потому что мы будем использовать pre-released версию Entity Framework, мы должны использовать Package Manager Console. В Visual Studio 11 Beta выберите Tools -> Library Package Manager -> Package Manager Console. В командной строке введите следующую команду: Install-Package EntityFramework –IncludePreRelease.
  5. Откройте файл Program.cs, удалите весь код из файла и вставьте следующий код.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.ModelConfiguration.Conventions;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
     
    namespace FederationsWithCodeFirst
    {
     public class Department
     {
     public Department()
     {
     this.Courses = new HashSet<Course>();
     }
     // Primary key
     public int DepartmentID { get; set; }
     public string Name { get; set; }
     public decimal Budget { get; set; }
     public System.DateTime StartDate { get; set; }
      
      
     // Navigation property
     public virtual ICollection<Course> Courses { get; private set; }
     }
      
      
     public class Course
     {
     public Course()
     {
     this.Enrollments = new HashSet<Enrollment>();
     }
     // Primary key
     public int CourseID { get; set; }
     public string Title { get; set; }
     public int Credits { get; set; }
      
     // Foreign key
     public int DepartmentID { get; set; }
      
     
     // Navigation properties
     public virtual Department Department { get; set; }
     public virtual ICollection<Enrollment> Enrollments { get; private set; }
     }
     
     
     public class Student
     {
     public Student()
     {
     this.Enrollments = new HashSet<Enrollment>();
     }
     // Primary key
     public int StudentID { get; set; }
     public string LastName { get; set; }
     public string FirstName { get; set; }
     public System.DateTime EnrollmentDate { get; set; }
     // Navigation property
     public virtual ICollection<Enrollment> Enrollments { get; private set; }
     }
     
     public class Enrollment
     {
     // Primary and Foreign keys
     [Key, Column(Order = 1)]
     public int EnrollmentID { get; set; }
     [Key, Column(Order = 2)]
     [ForeignKey("Student")]
     public int StudentID { get; set; }
     public int CourseID { get; set; }
     public decimal? Grade { get; set; }
      
     // Navigation properties
     public virtual Course Course { get; set; }
     public virtual Student Student { get; set; }
     }
     
     public partial class SchoolEntities : DbContext
     {
     public SchoolEntities()
     {
     }
     
     public DbSet<Course> Courses { get; set; }
     public DbSet<Department> Departments { get; set; }
     public DbSet<Student> Students { get; set; }
     public DbSet<Enrollment> Enrollments { get; set; }
     
     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
     // Tell Code First to ignore PluralizingTableName convention
     // If you keep this convention then the generated tables will have pluralized names.
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
     }
     }
     
     class Program
     {
     static void Main(string[] args)
     {
     
     }
     }
     }
  6.  Откройте файл App.config (он был добавлен к проекту автоматически) и добавьте дочерний элемент connectionString к элементу configuration. Укажите правильное имя сервера, имя пользователя и пароль.
<connectionStrings>
  <add
  name="SchoolEntities" providerName="System.Data.SqlClient"
  connectionString="Server=ServerName.database.windows.net;
  Database=School; Integrated Security=False;User ID=username;Password=password;
  Connect Timeout=15;Encrypt=False;TrustServerCertificate=False"/>
 </connectionStrings>
 

 7. Скомпилируйте проект. 

Выполнение запроса к концептуальной модели с использованием Linq to Entities

В этом разделе вы выполните запрос к концептуальной модели с использованием Linq to Entities. Вы подключитесь к члену федерации, который содержит студента с StudentID = 9. 

Вы также запросите связанные объекты из базы данных. Подробнее на эту тему см. Connecting to Federation Members from Entity Framework Code First application and Understanding SQL Azure Federations No-MARS Support and Entity Framework.

 

  1. Откройте файл Program.cs и добавьте следующий код в функцию Main.

    using (SchoolEntities context = new SchoolEntities())
    {
     string federationCmdText =
     @"USE FEDERATION StudentFederation (SID=9) WITH FILTERING=ON, RESET";
     
     // Access the EntityConnection on the context and open it prior to executing the USE FEDERATION command.
     ((IObjectContextAdapter)context).ObjectContext.Connection.Open();
     
     context.Database.ExecuteSqlCommand(federationCmdText);
      
     var students = (from s in context.Students select s).ToList();
     
     foreach (var s  in students)
     {
     if (s != null)
     {
     Console.WriteLine("First Name {0} Last Name: {1} is enrolled in the following courses:",
     s.LastName, s.FirstName);
     foreach (var e in s.Enrollments)
     {
     Console.WriteLine("Course: {0}, Grade: {1}", e.Course.Title, e.Grade);
     }
     }
     }
    }

    2. Скомпилируйте проект и запустите программу. 

Заключение

В этом пошаговом руководстве мы продемонстрировали, как работать с федерациями в SQL Azure,  как выполнять запросы к члену федерации из приложения Entity Framework Code First, а также другие задачи, связанные с федерациями и Code First.