Как запросить объекты несколькими наборами сущностей для типа (платформа Entity Framework)

Благодаря реализации нескольких наборов сущностей на тип приложения могут обращаться к данным одного типа, находящимся в отдельных секциях хранилища. Код в этом разделе демонстрирует доступ к одному типу Customer в двух отдельных коллекциях, возращенных запросом <T>, предоставленным контекстом объекта. В коде этого раздела используется модель данных, подготовленная в разделе Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework).

Настройка проекта и приложения с использованием нескольких наборов сущностей для типа

  1. Создайте проект приложения командной строки и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.

  2. Добавьте ссылку на библиотеку, созданную из модели наследования в разделе Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework).

  3. Добавьте схемы из раздела Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework) в папку, в которой расположен исполняемый файл.

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="RegionalCustomersEntities" 
         connectionString="metadata=.;
         provider=System.Data.SqlClient;
         provider connection string=&quot;
         Data Source=serverName;
         Initial Catalog=RegionalCustomersMEST;
         Integrated Security=True;
         multipleactiveresultsets=true&quot;" 
         providerName="System.Data.EntityClient" />
  </connectionStrings>

</configuration>

Пример

В приведенном образце кода используется несколько наборов сущностей на тип. Используйте этот код в программном файле проекта.

В следующем примере обращение к типу Customer выполняется как из запроса CustomersEast, так и из запроса CustomersWest .

Перемещение по ассоциации между клиентом и заказом можно осуществить из элемента ассоциации OrderEast, OrderWest или Customer.

Option Explicit On
Option Strict On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports RegionalCustomersModel

Module Module1
    Sub Main()
        Try
            Using objCtx As RegionalCustomersEntities = _
                        New RegionalCustomersEntities()
                Console.WriteLine("Number of Customers East: " & _
                    objCtx.CustomersEast.Count().ToString())

                For Each customer As Customer In objCtx.CustomersEast
                    Console.WriteLine(customer.Name)
                    customer.OrdersEast.Load()
                    Dim totalOrderAmts As Decimal = 0
                    For Each order As OrderEast In customer.OrdersEast
                        Console.WriteLine( _
                            "Order: {0} Total: {1} Tax: {2}", _
                            order.OrderId, order.OrderTotal, order.Tax)
                        totalOrderAmts = totalOrderAmts + order.OrderTotal
                    Next

                    Console.WriteLine("Check totals: {0} <=> {1}", _
                        totalOrderAmts.ToString(), _
                        customer.TotalPurchases.ToString())
                Next

                Console.WriteLine("Number of Customers West: " & _
                    objCtx.CustomersWest.Count().ToString())
                'objCtx.CustomersWest.Count(Of Customer)().ToString())

                For Each customer As Customer In objCtx.CustomersWest
                    Console.WriteLine(customer.Name)

                    Dim totalOrderAmts As Decimal = 0
                    customer.OrdersWest.Load()

                    For Each order As OrderWest In customer.OrdersWest
                        Console.WriteLine( _
                                "Order: {0} Total: {1} Tax: {2}", _
                                order.OrderId, order.OrderTotal, _
                                order.Tax)

                        totalOrderAmts = totalOrderAmts + order.OrderTotal
                    Next

                    Console.WriteLine("Check totals: {0} <=> {1}", _
                        totalOrderAmts.ToString(), _
                        customer.TotalPurchases.ToString())
                Next

                ' Access Customer from Order.  For Each order As OrderEast In objCtx.OrdersEast
                    order.CustomerReference.Load()
                    Console.WriteLine("{0} Order Total: {1}", _
                        order.Customer.Name, order.OrderTotal.ToString())
                Next
            End Using
        Catch ex As Exception
            Console.WriteLine(ex.ToString())
        End Try
    End Sub
End Module  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RegionalCustomersModel;
using System.Data.Objects;

namespace ClientRegionalCustomers
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (RegionalCustomersEntities objCtx = 
                    new RegionalCustomersEntities())
                {

                    Console.WriteLine("Number of Customers East: " +
                            objCtx.CustomersEast.  Count<Customer>().ToString());

                    foreach (Customer customer in objCtx.CustomersEast)
                    {
                        Console.WriteLine(customer.Name);
                        customer.OrdersEast.Load();
                        decimal totalOrderAmts = 0;
                        foreach (OrderEast order in
                                               customer.OrdersEast)
                        {
                            Console.WriteLine(
                                "Order: {0} Total: {1} Tax: {2}",
                                order.OrderId,
                                order.OrderTotal,
                                order.Tax);
                            totalOrderAmts =
                                 totalOrderAmts + order.OrderTotal;
                        }

                        Console.WriteLine("Check totals: {0} <=> {1}",
                        totalOrderAmts.ToString(), 
                        customer.TotalPurchases.ToString());
                    }

                    Console.WriteLine("Number of Customers West: " +
                            objCtx.CustomersWest.  Count<Customer>().ToString());
                    
                    foreach (Customer customer in objCtx.CustomersWest)
                    {
                        Console.WriteLine(customer.Name);

                        decimal totalOrderAmts = 0;
                        customer.OrdersWest.Load();

                        foreach (OrderWest order in
                                               customer.OrdersWest)
                        {
                            Console.WriteLine(
                                "Order: {0} Total: {1} Tax: {2}",
                                order.OrderId,
                                order.OrderTotal,
                                order.Tax);

                            totalOrderAmts = totalOrderAmts + order.OrderTotal;
                        }

                        Console.WriteLine("Check totals: {0} <=> {1}",
                        totalOrderAmts.ToString(),
                        customer.TotalPurchases.ToString());
                    }

                     // Access Customer from Order.  foreach (OrderEast order in objCtx.OrdersEast)
                    {
                        order.CustomerReference.Load();
                        Console.WriteLine("{0} Order Total: {1}",
                            order.Customer.Name, 
                            order.OrderTotal.ToString() );
                        
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

        }
    }
}  

См. также

Задачи

Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework)