Программирование >>  Каркас сущностей ado.net 

1 2 3 4 [ 5 ] 6 7 8


Выбор типа конкретного класса осуществляется на основе элемента Condition, как вы можете видеть в файле MSL. Здесь выбор типа определяется значением столбца Type. Возможны и другие варианты выбора типа; например, вы можете проверять, равен ли столбец null.

<Mapping Space= C-S

xmlns= urn:schemas-microsoft-com:windows:storage:mapping:CS > <EntityContainerMapping StorageEntityContainer= dbo CdmEntityContainer= EntitiesDemoEntities > <EntitySetMapping Name= Payments >

<EntityTypeMapping TypeName= IsTypeOf(Wrox.ProCSharp.Entities.Payment) > <MappingFragment StoreEntitySet= Payments > <ScalarProperty Name= Id ColumnName= Id /> <ScalarProperty Name= Amount ColumnName= Amount /> <ScalarProperty Name= Name ColumnName= Name /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping

TypeName= IsTypeOf(Wrox.ProCSharp.Entities.CashPayment) > <MappingFragment StoreEntitySet= Payments > <ScalarProperty Name= Id ColumnName= Id /> <Condition ColumnName= Type Value= CASH /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping

TypeName= IsTypeOf(Wrox.ProCSharp.Entities.CreditCardPayment) > <MappingFragment StoreEntitySet= Payments > <ScalarProperty Name= Id ColumnName= Id /> <ScalarProperty Name= CreditCard ColumnName= CreditCard /> <Condition ColumnName= Type Value= CREDIT /> </MappingFragment> </EntityTypeMapping> <EntityTypeMapping

TypeName= IsTypeOf(Wrox.ProCSharp.Entities.ChequePayment) > <MappingFragment StoreEntitySet= Payments > <ScalarProperty Name= Id ColumnName= Id /> <ScalarProperty Name= BankName ColumnName= BankName /> <Condition ColumnName= Type Value= CHEQUE /> </MappingFragment> </EntityTypeMapping> </EntitySetMapping>

</EntityContainerMapping> </Mapping>

Теперь можно выполнять итерацию по данным из таблицы Payment, при этом будут возвращаться разные типы на основе отображения:

PaymentEntities data = new PaymentEntities(); foreach (var p in data.Payments)

Console.WriteLine( {0}, {1} - {2:C} , p.GetType().Name, p.Name, p.Amount);

Запуск этого приложения вернет из базы данных два объекта CashPayment и один объект CreditCardPayment:

CreditCardPayment, Gustav - $22.00 CashPayment, Donald - $0.50 CashPayment, Dagobert - $80,000.00



Таблица на тип

При TPT одна таблица отображается на один тип. База данных Northwind имеет схему с таблицами Customers, Orders и Order Details (рис. А.5). Таблица Orders отображается на таблицу Customers по внешнему ключу CustomerId; таблица Order Details отображается на таблицу Orders по внешнему ключу OrderID.


Рис. A.5. Таблицы Customers, Orders и Order Details

На рис. А.6 показаны сущностные типы Customer, Order и OrderDetail. Типы Customer и Order имеют отношение ноль или один ко многим с Customer и Order, потому что столбец CustomerID в таблице Order определен в схеме базы данных как

Nullable.


Рис. A.6. Сущностные типы Customer, Order и OrderDetail

Вы обращаетесь к заказчикам и их заказам за две итерации, показанные здесь. Сначала идет обращение к объектам Customer, и значение свойства CompanyName выводится на консоль. Затем идет обращение ко всем заказам через свойство Orders класса Customer. Поскольку относящиеся к заказчику заказы не загружаются в объектный контекст по умолчанию, вызывается метод Load() объекта EntityCollection<Order> на свойстве Orders.



NorthwindEntities data = new NorthwindEntities(); foreach (Customer customer in data.Customers)

Console.WriteLine( {0} , customer.CompanyName); if (!customer.Orders.IsLoaded)

customer.Orders.Load(); foreach (Order order in customer.Orders)

Console.WriteLine( {0} {1:d} , order.OrderID, order.OrderDate);

Для доступа к отношению за кулисами класс используется RelationshipManager. К экземпляру RelationShipManager можно обратиться, приведя сущностный объект к типу интерфейса IEntityWithRelationships. Этот интерфейс явно реализован классом EntityObject.

Свойство RelationshipManager возвращает RelationshipManager, ассоциированный с сущностным объектом на одном конце. Другой конец отношения определяется вызовом метода GetRelatedCollection(). Первый параметр NorthwindModel. FK Orders Customers - это имя отношения; второй параметр Orders определяет имя целевой роли.

RelationshipManager rm =

((IEntityWithRelationships)customer).RelationshipManager; EntityCollection<Order> orders =

rm.GetRelatedCollection<Order> (

NorthwindModel.FK Orders Customers , Orders );

Загрузка отношений является отложенной. Метод Load() класса EntityCollection получает данные из хранилища. Одна из перегрузок метода Load() принимает перечисление MergeOption. Его допустимые значения перечислены в табл. А.4.

По умолчанию загрузка отношений является отложенной. Например, если вы определяете отношение между таблицами Customers и Orders, и запрашиваете заказчиков, то записи Orders этих заказчиков не загружаются. Срок их загрузки откладывается до того момента, когда они будут нужны. Принудительное извлечение (eager fetching) означает, что когда вы обращаетесь к записи о заказчике, его заказы также загружаются.

Таблица А.4. Значения перечисления MergeOption

Значение MergeOption Описание

AppendOnly Это значение по умолчанию. Новые сущности добавляются; имею-

щиеся сущности в объектном контексте не модифицируются.

NoTracking ObjectStateManager, отслеживающий изменения в сущностных

объектах, не модифицируется.

OverwriteChanges Текущие значения сущностных объектов заменяются значениями

из хранилища.

PreserveChanges Оригинальные значения сущностных объектов в объектном контек-

сте заменяются значениями из хранилища.

Запрос объектов

Запрашивание объектов - одна из служб, предоставляемых каркасом ADO.NET Entity Framework. Запросы могут осуществляться посредством LINQ to Entities, Entity SQL и методов Query Builder, создающих Entity SQL. LINQ to Entities рассматривается в последнем разделе настоящего приложения. Остальные два варианта рассмотрим первыми.



1 2 3 4 [ 5 ] 6 7 8

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика