Сущности и класс ObjectContext

60

Сущности

Сущностные классы создаются в визуальном конструкторе посредством CSDL. Они определяют свойства для своих данных, такие как CarID и Color. Средства доступа set этих свойств инициируют изменение информации двумя разными способами. Один способ состоит в вызове методов ReportPropertyChanging() и ReportPropertyChanged() базового класса EntityObject. Вызов этих методов использует интерфейсы INotifyPropertyChanging и INotifyPropertyChanged для информирования каждого клиента, который зарегистрирован на получение событий об этих интерфейсах.

Другой способ предусматривает применение частичных методов, таких как OnCarIDChanging() и OnCarIDChanged(), которые не имеют реализаций по умолчанию, но могут быть реализованы в специальных расширениях этого класса:

[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.Int32 CarID
        {
            get
            {
                return _CarID;
            }
            set
            {
                if (_CarID != value)
                {
                    OnCarIDChanging(value);
                    ReportPropertyChanging("CarID");
                    _CarID = StructuralObject.SetValidValue(value);
                    ReportPropertyChanged("CarID");
                    OnCarIDChanged();
                }
            }
        }
        private global::System.Int32 _CarID;
        partial void OnCarIDChanging(global::System.Int32 value);
        partial void OnCarIDChanged();
        ...

Классы и интерфейсы, важные в контексте сущностных классов, описаны в таблице. За исключением INotifyPropertyChanging и INotifyPropertyChanged, эти типы определены в пространстве имен System.Data.Objects.DataClasses:

StructuralObject StructuralObject — базовый класс для классов EntityObject и ComplexObject. Этот класс реализует интерфейсы INotifyPropertyChanging и INotifyPropertyChanged.
INotifyPropertyChanging, INotifyPropertyChanged Эти интерфейсы определяют события PropertyChanging и PropertyChanged, позволяющие подписываться на информацию об изменении состояния объекта. В отличие от прочих классов и интерфейсов, которые перечислены здесь, эти интерфейсы находятся в пространстве имен System.ComponentModel.
IEntityWithRelationships Этот интерфейс определяет свойство только для чтения RelationshipManager, которое возвращает объект RelationshipManager, используемый для навигации между объектами.
EntityObject Этот класс наследуется от StructuralObject и реализует интерфейсы IEntityWithKey, IEntityWithChangeTracker и IEntityWithRelationships. Часто используется в качестве базового класса для объектов, отображаемых на таблицы базы данных, которые содержат ключи и отношения с другими объектами.
ComplexObject Этот класс может служить в качестве базового для сущностных объектов, которые не имеют ключа. Он наследуется от StructuralObject, но не реализует других интерфейсов, как это делает класс EntityObject.
IEntityWithKey Этот интерфейс определяет свойство EntityKey, которое позволяет быстрый доступ к объекту.
IEntityWithChangeTracker Этот интерфейс определяет метод SetChangeTracker(), в котором может быть назначен монитор изменений, реализующий IChangeTracker для получения информации об изменении состояния объекта.

Для сущностного класса не обязательно быть наследником базового класса EntityObject или ComplexObject. Вместо этого сущностный класс может реализовать необходимые интерфейсы.

ObjectContext

Чтобы извлечь информацию из базы данных, необходим класс ObjectContext. Этот класс определяет отображение сущностных объектов на базу данных. Этот класс можно сравнить с адаптером данных из основного ADO.NET, который наполняет DataSet.

Класс AutoLotEntities, созданный визуальным конструктором, наследуется от базового класса ObjectContext. Этот класс добавляет конструкторы, принимающие строку соединения. В конструкторе по умолчанию строка соединения читается из конфигурационного файла. Можно также передать конструктору уже открытое соединение в виде экземпляра EntityConnection. Если передать конструктору неоткрытое соединение, объект ObjectContext откроет и закроет соединение. В случае передачи открытого соединения его понадобится впоследствии закрыть. Созданный класс определяет свойства Books и Authors, которые возвращают ObjectSet<TEntity>. Это новый класс в .NET 4, унаследованный от класса ObjectQuery<TEntity>:

public partial class AutoLotEntities : ObjectContext
    {
        #region Конструкторы
    
        /// <summary>
        /// Инициализирует новый объект AutoLotEntities, используя строку соединения из раздела "AutoLotEntities" файла конфигурации приложения.
        /// </summary>
        public AutoLotEntities() : base("name=AutoLotEntities", "AutoLotEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
        /// <summary>
        /// Инициализация нового объекта AutoLotEntities.
        /// </summary>
        public AutoLotEntities(string connectionString) : base(connectionString, "AutoLotEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
        /// <summary>
        /// Инициализация нового объекта AutoLotEntities.
        /// </summary>
        public AutoLotEntities(EntityConnection connection) : base(connection, "AutoLotEntities")
        {
            this.ContextOptions.LazyLoadingEnabled = true;
            OnContextCreated();
        }
    
        #endregion
    
        #region Разделяемые методы
    
        partial void OnContextCreated();
    
        #endregion
    
        #region Свойства ObjectSet
    
        /// <summary>
        /// Нет доступной документации по метаданным.
        /// </summary>
        public ObjectSet<Car> Cars
        {
            get
            {
                if ((_Cars == null))
                {
                    _Cars = base.CreateObjectSet<Car>("Cars");
                }
                return _Cars;
            }
        }
        private ObjectSet<Car> _Cars;

        #endregion
        #region Методы AddTo
    
        /// <summary>
        /// Устаревший метод для добавления новых объектов в набор EntitySet Cars. Взамен можно использовать метод .Add связанного свойства ObjectSet<T>.
        /// </summary>
        public void AddToCars(Car car)
        {
            base.AddObject("Cars", car);
        }

        #endregion
    }

Класс ObjectContext предоставляет вызывающему коду несколько услуг:

Методы и свойства класса ObjectContext перечислены ниже:

Connection

Возвращает объект DbConnection, присвоенный объектному контексту.

MetadataWorkspace

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

QueryTimeout

С помощью этого свойства можно получать и устанавливать значение таймаута для запросов объектного контекста.

ObjectStateManager

Это свойство возвращает ObjectStateManager. Диспетчер ObjectStateManager следит за извлеченными сущностными объектами и изменениями объектов из объектного контекста.

CreateQuery()

Этот метод возвращает ObjectQuery для получения данных из хранилища.

GetObjectByKey(), TryGetObjectByKey()

Эти методы возвращают объект по ключу — либо от диспетчера состояния объектов, либо из лежащего в основе хранилища. Если ключ отсутствует, GetObjectByKey() генерирует исключение типа ObjectNotFoundException. Метод TryGetObjectByKey() возвращает false.

AddObject()

Этот метод добавляет новый сущностный объект к объектному контексту.

DeleteObject()

Этот метод удаляет объект из объектного контекста.

Detach()

Этот метод отсоединяет сущностный объект от объектного контекста, так что его изменения больше не отслеживаются.

Attach(), AttachTo()

Метод Attach() присоединяет отсоединенный объект к хранилищу. Присоединение объектов обратно к объектному контексту требует, чтобы сущностный объект реализовывал интерфейс IEntityWithKey. Метод AttachTo() не предъявляет требования наличия ключа у объекта, но требует установки имени сущности, когда объект нуждается в присоединении.

ApplyPropertyChanges()

Если объект отключен от объектного контекста, то если отключенный объект модифицируется, и затем эти изменения должны быть применены внутри объектного контекста, можно вызвать метод ApplyPropertyChanges() для применения изменений. Это удобно в тех сценариях, когда отсоединенный объект возвращается веб-службой, изменяется на клиенте и передается веб-службе в модифицированном виде.

Refresh()

Пока сущностные объекты находятся внутри объектного контекста, данные в хранилище могут изменяться. Чтобы выполнить обновление данных из хранилища, можно использовать метод Refresh(). Этому методу можно передавать значение перечисления RefreshMode. Если значения объекта отличаются между хранилищем и объектным контекстом, передача значения Clientwins изменяет данные в хранилище. Значение storewins изменяет данные в объектном контексте.

SaveChanges()

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

AcceptAllChanges()

Этот метод изменяет состояние объектов в контексте на немодифицированное. SaveChanges() неявно вызывает этот метод.

Пройди тесты
Лучший чат для C# программистов