|
Программирование >> Каркас сущностей ado.net
Выбор типа конкретного класса осуществляется на основе элемента 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 рассматривается в последнем разделе настоящего приложения. Остальные два варианта рассмотрим первыми.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |