API LINQ para trabalhar com Caché Globals da .NET Entity Framwork
## Introdução “Globals EF” é uma estrutura de mapeamento de objeto/relacional (O/RM) para cache de bancos de dados conhecido. Como você sabe, o banco de dados Caché é alimentado por um mecanismo de dados multidimensional extremamente eficiente. A interface exposta suporta acesso às estruturas multidimensionais, fornecendo o maior desempenho e a maior gama de possibilidades de armazenamento. O cache é muito útil para aplicativos que funcionam com "big data" e há cada vez mais esses aplicativos hoje em dia. O .NET Framework com linguagem de programação C# facilita a criação e a manutenção de aplicativos para os desenvolvedores. Portanto, é fácil usar o cache entre sistemas em aplicativos .NET é uma tarefa real. A InterSystems fornece a tecnologia Extreme Caché que fornece acesso à API Globals a partir de aplicativos .NET, mas a criação de aplicativos ainda consome tempo. Portanto, o principal objetivo do Globals EF é facilitar o trabalho com Caché e GlobalsDB. O núcleo dessa estrutura é a Tecnologia Extrema do InterSystems Caché. A estrutura descrita fornece muitas funções úteis, como mapeamento de objeto/relacional, LINQ para Globals e torna a interação com Caché e GlobalsDB simples e sem costura.
##Instalação
## API pública
#### Dbset Class
A classe DbSet<TEntity> representa uma entidade usada para operações de criação, leitura, atualização e exclusão.
Esta classe implementa as interfaces IOrderedQueryable<TEntity> e IQueryProvider ; portanto, você pode usar expressões LINQ na instância DbSet<TEntity> para obter dados do banco de dados. Devido à implementação do IOrderedQueryable<TEntity> , você também pode usar consultas de classificação, como Orderby, OrderByDescending, Thenby ou ThenByDescending.
A classe DBSET também implementa a interface IDbSet<TEntity> , que declara os seguintes métodos:
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 ) ; Esses métodos podem ser usados para executar operações correspondentes com dados. Você pode manipular uma entidade única ou conjunto de entidades.
#### Tentidade
O parâmetro genérico para classe descrita anteriormente ( DbSet<TEntity> ) representa a entidade que você precisa armazenar em um banco de dados. Restreção para a tentidade - deve ser uma aula, declarada pública.
Nesta classe, você pode declarar propriedades públicas que correspondem à entidade.
Observe que no banco de dados armazenou apenas as propriedades, que atendem aos seguintes requisitos:
#### colunattribute
ColumnAttribute pode ser aplicado à propriedade da entidade para indicar que essa propriedade deve ser armazenada em um banco de dados.
ColumnAttribute contém as seguintes propriedades:
public string Name { get ; set ; } Indique que a propriedade da entidade (coluna) deve ser armazenada em um banco de dados com outro nome, mais curto, do exemplo. Se o valor não for fornecido, será usado o nome da propriedade na classe de entidade. Por exemplo, neste caso
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } A propriedade será armazenada como "id" e, neste caso
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } como "IdentificationNumber".
public bool IsPrimaryKey { get ; set ; } Indique que a coluna é a chave primária. Você pode descrever as teclas primárias complexas aplicando ColumnAttribute (com a propriedade IsPrimaryKey definida como true) a várias colunas. O Framework gerencia as chaves primárias e jogará GlobalsDbException ("Violação da restrição de chave primária. Não é possível inserir a chave duplicada") se você tentar inserir entidades com as mesmas chaves primárias.
public bool IsDbGenerated { get ; set ; } Indique que a coluna de chave primária é a identidade, ou seja, gerada pela estrutura. Ele suporta apenas tipos inteiros ( Int16 , Int32 e Int64 ).
Existem algumas regras para aplicar ColumnAttribute em entidades:
IsPrimaryKey do ColumnAttributeshort , int ou long ) suportados como coluna DbGeneratedDbGenerated é permitidaDbGenerated são permitidas Se essas regras não forem atendidas, EntityValidationException será lançada. Se a entidade tiver a chave de identidade, a estrutura a gerará, insira a entidade no banco de dados e definirá seu valor como coluna marcada como chave de identidade.
#### dbsetattribute
O dbsetattribute pode ser aplicado à classe de tentidade. Este atributo descreve apenas uma propriedade
public string Name { get ; set ; }Indique que Global for Entity no banco de dados Globals deve ter outro nome. Uso semelhante ao uso da mesma propriedade em Columnattribute.
A aplicação DbSetAttribute à classe de tentidade não é obrigatória.
#### datacontext
Classe abstrata que fornece conexão com o banco de dados. Você precisa criar classe derivada com conjunto de propriedades ou campos públicos DbSet<TEntity> para obter acesso aos dados do banco de dados.
Declarado o método público SubmitChanges() envia todas as alterações com o banco de dados que os usos fizeram com os métodos públicos de classe DbSet<TEntity> (como InsertOnSubmit(TEntity entity) ).
A classe DataContext possui dois construtores protegidos.
protected DataContext(string namespc, string user, string password)protected DataContext()#### GlobalsDBexception
A estrutura lança a GlobalsDBexception nos seguintes casos:
#### entityValidationException
O Framework lança EntityValidationException quando o cliente declarou entidade que não atende aos seguintes requisitos:
IsPrimaryKey do ColumnAttributeshort , int ou long ) suportados como coluna DbGeneratedDbGenerated é permitidaDbGenerated são permitidas## Como usar
Principalmente, sua necessidade de declarar as classes do modelo de domínio. Neste exemplo, o modelo de domínio consiste em quatro entidades (país, faculdade, universidade e cidade) que formam hierarquia complexa. Toda propriedade da entidade, que você precisa ser armazenada no banco de dados deve estar marcada com o ColumnAttrubute .
Essas entidades foram declaradas dessa maneira:
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 ; }
} Como você pode ver, todos os países contêm lista de cidades, todas as cidades contêm lista de universidades e todas as universidades contêm lista de faculdades. ColumnAttribute é fornecido para todas as colunas que precisam ser armazenadas no banco de dados.
Vou armazenar a entidade do país no banco de dados e todas as entidades infantis serão serializadas para globais no banco de dados Caché automaticamente. De acordo com as regras do ColumnAttribute , preciso declarar a chave primária para o país da entidade. Então, marquei Name da propriedade como chave primária.
Para operar com a entidade do país, você precisa, a princípio, para criar classe derivada de DataContext . Em segundo lugar, você precisa declarar a propriedade DbSet<TEntity> na classe derivada, onde o tipo de entidade da tentativa que você deseja armazenar no banco de dados. Eu declarei a classe TestDataContext de acordo com as regras mencionadas. A classe TestDataContext possui apenas um Countries de propriedade pública.
Também declarei o Public Parameontless Constors, que chama o construtor de credenciais de segurança, o uso da UniversityInfodatacontext se torna muito conveniente.
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} Para manipular dados, você pode usar diferentes métodos de DbSet<TEntity> que foram descritos na seção anterior. Observe que todas as alterações aplicadas somente quando o método de contexto SubmitChanges foi invocado.
Por exemplo, criar uma nova entidade country no banco de dados é muito simples:
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}Além disso, você pode usar consultas LINQ para obter dados do banco de dados. Por exemplo, você pode obter todos os países que têm mais de uma cidade:
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}