API LINQ для работы с Cache Global
## Введение «Globals ef»-это структура объекта/реляционного отображения (O/RM) для хорошо известных баз данных Caché. Как вы знаете, база данных CACHE питается чрезвычайно эффективным многомерным двигателем данных. Поддержка интерфейса доступа к многомерным структурам, обеспечивая наивысшую производительность и наибольший диапазон возможностей хранения. Caché очень полезен для приложений, которые работают с «большими данными», и в настоящее время существует все больше и больше этих приложений. .Net Framework с языком программирования C# делает создание и обслуживание приложений очень простыми для разработчиков. Следовательно, простой использование Intersystems Caché в приложениях .NET является фактической задачей. Intersystems предоставляет Caché Extreme Technology, которая предоставляет доступ к API Globals из приложений .NET, но создание приложений все еще занимает много времени. Таким образом, основная цель глобалов EF - облегчить работу с Cache и GlobalSdb. Яркой этой структуры являются Intersystems Caché Extreme Technology. Описанная структура обеспечивает много полезных функций, таких как объект/реляционное картирование, LINQ для глобалов и делает взаимодействие с Caché и GlobalsDB простым и беспрепятственным.
## Установка
## public api
#### DBSET Class
DbSet<TEntity> класс представляет собой объект, которая используется для создания, чтения, обновления и удаления операций.
Этот класс реализует интерфейсы IOrderedQueryable<TEntity> и IQueryProvider , поэтому вы можете использовать экспрессии LINQ на экземпляре DbSet<TEntity> для получения данных из базы данных. В связи с реализацией IOrderedQueryable<TEntity> вы также можете использовать запросы сортировки, такие как Orderby, OrderBydescending, Thenby или ThenByDescending.
Класс DBSET также реализует интерфейс IDbSet<TEntity> , который объявляет следующие методы:
void InsertOnSubmit ( TEntity entity ) ;
void InsertAllOnSubmit ( IEnumerable < TEntity > entities ) ;
void UpdateOnSubmit ( TEntity entity ) ;
void UpdateAllOnSubmit ( IEnumerable < TEntity > entities ) ;
void DeleteOnSubmit ( TEntity entity ) ;
void DeleteAllOnSubmit ( IEnumerable < TEntity > entities ) ; Эти методы могут быть использованы для выполнения соответствующих операций с данными. Вы можете манипулировать отдельной сущностью или набором сущностей.
#### Печальность
Общий параметр для ранее описанного класса ( DbSet<TEntity> ) представляет объект, который вам необходимо хранить в базе данных. Ограничение для шага - это должен быть класс, объявленный общественным.
В этом классе вы можете объявить общественную собственность, которые соответствуют сущности.
Обратите внимание, что в базе данных хранится только те свойства, которые соответствуют следующим требованиям:
#### columnattribute
ColumnAttribute может применяться к свойству объекта, чтобы указать, что это свойство должно храниться в базе данных.
ColumnAttribute содержит следующие свойства:
public string Name { get ; set ; } Укажите, что свойство объекта (столбец) должно храниться в базе данных с другим именем, более коротким, из примера. Если значение не предоставлено, тогда будет использоваться имя свойства в классе объекта. Например, в этом случае
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } Собственность будет храниться как «удостоверение личности» и в этом случае
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } как «IdentificationNumber».
public bool IsPrimaryKey { get ; set ; } Укажите, что столбец является первичным ключом. Вы можете описать сложные первичные ключи, применяя ColumnAttribute (со свойствами IsPrimaryKey , установленным в True) к нескольким столбцам. Framework управляет первичными ключами и будет выбросить GlobalsDbException («нарушение ограничения первичного ключа. Не удается вставить дубликат ключа»), если вы попытаетесь вставить сущности с одинаковыми первичными ключами.
public bool IsDbGenerated { get ; set ; } Укажите, что столбец первичного ключа является идентичностью, т.е. сгенерирована Framework. Он поддерживает только целые типы ( Int16 , Int32 и Int64 ).
Есть некоторые правила для применения ColumnAttribute в объектах:
ColumnAttribute собственностью IsPrimaryKeyshort , int или long ) поддерживаются в виде DbGenerated ColumnDbGenerated ColumnDbGenerated первичный ключ или пользовательские первичные ключи разрешены Если эти правила не будут соблюдены, EntityValidationException будет брошено. Если у Entity есть идентификационный ключ, Framework будет сгенерировать его, вставьте объект в базу данных и установите его значение в столбец, который помечен как идентификационный ключ.
#### dbsetattribute
DBSetAttribute может быть применен к классу палатка. Этот атрибут описывает только одно свойство
public string Name { get ; set ; }Укажите, что Global для сущности в базе данных Globals должен иметь другое имя. Использование аналогично использованию того же свойства в Columnattribute.
Применение DbSetAttribute к классу палаточного препарата не является обязательным.
#### DataContext
Абстрактный класс, который обеспечивает подключение к базе данных. Вам необходимо создать производственный класс с набором DbSet<TEntity> Общественные свойства или поля для получения доступа к данным базы данных.
Объявленный общедоступный метод SubmitChanges() представляет все изменения с базой данных, которые используются, с помощью публичных методов DbSet<TEntity> класса (например, InsertOnSubmit(TEntity entity) ).
Класс DataContext имеет два защищенных конструктора.
protected DataContext(string namespc, string user, string password)protected DataContext()#### GlobalsDbexception
Структура бросает GlobalsDbexception в следующих случаях:
#### EntityValidationException
Структура выбрасывает EntityValidationException , когда клиент объявил организацию, которая не соответствует следующим требованиям:
ColumnAttribute собственностью IsPrimaryKeyshort , int или long ) поддерживаются в виде DbGenerated ColumnDbGenerated ColumnDbGenerated первичный ключ или пользовательские первичные ключи разрешены## Как использовать
В первую очередь вам необходимо объявить классы модели доменной модели. В этом примере доменная модель состоит из четырех организаций (страна, преподаватели, университет и город), которые образуют сложную иерархию. Каждое свойство в сущности, которую вы должны хранить в базе данных, должно быть помечено ColumnAttrubute .
Тезисы были объявлены таким образом:
public sealed class Country
{
[ Column ( IsPrimaryKey = true ) ]
public string Name { get ; set ; }
[ Column ( ) ]
public Continent Continent { get ; set ; }
[ Column ( ) ]
public bool HasSee { get ; set ; }
[ Column ( ) ]
public List < Town > Towns { get ; set ; }
} public sealed class Town
{
[ Column ( ) ]
public string Name { get ; set ; }
[ Column ( ) ]
public bool IsCapital { get ; set ; }
[ Column ( ) ]
public int Population { get ; set ; }
[ Column ( ) ]
public List < University > Universities { get ; set ; }
} public sealed class University
{
[ Column ]
public string Name { get ; set ; }
[ Column ]
public string Description { get ; set ; }
[ Column ]
public List < Faculty > Faculties { get ; set ; }
} public class Faculty
{
[ Column ( ) ]
public string Name { get ; set ; }
[ Column ]
public string Description { get ; set ; }
} Как вы можете видеть, каждая страна содержит список городов, в каждом городе есть список университетов, а каждый университет содержит список факультетов. ColumnAttribute поставляется для каждого столбца, который необходимо хранить в базе данных.
Я собираюсь хранить страну в базе данных, и все дочерние организации будут автоматически сериализованы на глобале в базе данных CACHE. Согласно правилам ColumnAttribute , мне нужно объявить первичный ключ для страны организации. Поэтому я пометил Name свойства как первичный ключ.
Работать с страновой организацией, сначала вам нужно создать производный класс DataContext . Во -вторых, вам необходимо объявить свойство DbSet<TEntity> в полученном классе, где палаток - тип объекта, который вы хотите сохранить в базе данных. Я объявил класс TestDataContext в соответствии с упомянутыми правилами. Class TestDataContext имеет только одну Countries общественной собственности.
Также я объявил общедоступного конфигуратора без параметра, который вызывает конструктор с учетными данными, таким образом, использование UniversityInfodatacontext становится очень удобным.
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} Для манипулирования данными вы можете использовать различные методы DbSet<TEntity> , которые были описаны в предыдущем разделе. Обратите внимание, что все изменения, применяемые только при SubmitChanges метода контекста.
В качестве примера, создать новую страну в базе данных очень просто:
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}Кроме того, вы можете использовать запросы LINQ для получения данных из базы данных. Например, вы можете получить все страны, в которых есть более одного города:
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}