API LINQ pour travailler avec Cache Globals de .NET ENTITY FRAMWROWN
## Introduction «Globals EF» est un cadre d'objet / cartographie relationnelle (O / RM) pour le cache inter-systèmes de base de données bien connu. Comme vous le savez, la base de données Caché est alimentée par un moteur de données multidimensionnel extrêmement efficace. L'interface exposée prend en charge l'accès aux structures multidimensionnelles, offrant les performances les plus élevées et la plus grande gamme de possibilités de stockage. Caché est très utile pour les applications qui fonctionnent avec «Big Data» et il y a de plus en plus ces applications de nos jours. .NET Framework avec le langage de programmation C # rend la création et la maintenance des applications très faciles pour les développeurs. Par conséquent, facile à utiliser les applications inter-systèmes dans les applications .NET est une tâche réelle. InterSystems fournit une technologie Caché Extreme qui donne accès à l'API global à partir des applications .NET, mais la création d'applications prend toujours du temps. Ainsi, le but principal des Globals EF est de faciliter le travail avec Caché et GlobalDB. Le noyau de ce cadre est la technologie Intersystems Caché Extreme. Le framework décrit offre de nombreuses fonctions utiles, telles que la cartographie objet / relationnelle, LINQ aux globaux et rend l'interaction avec Caché et GlobalsDB simple et transparente.
##Installation
## API publique
Classe #### DBSET
La classe DbSet<TEntity> représente une entité utilisée pour créer, lire, mettre à jour et supprimer les opérations.
Cette classe implémente les interfaces IOrderedQueryable<TEntity> et IQueryProvider , vous pouvez donc utiliser les expressions LINQ sur une instance DbSet<TEntity> pour obtenir des données à partir de la base de données. En raison de la mise en œuvre de IOrderedQueryable<TEntity> , vous pouvez également utiliser des requêtes de tri, telles que OrderBy, OrderByDescending, alors par ou alors par.
La classe DBSET implémente également l'interface IDbSet<TEntity> qui déclare les méthodes suivantes:
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 ) ; Ces méthodes peuvent être utilisées pour effectuer des opérations correspondantes avec des données. Vous pouvez manipuler une seule entité ou un ensemble d'entités.
#### Tentité
Le paramètre générique pour la classe décrite précédemment ( DbSet<TEntity> ) représente l'entité que vous devez stocker dans une base de données. Restriction pour la tenté - ce doit être une classe, déclarée publique.
Dans cette classe, vous pouvez déclarer des propriétés publiques qui correspondent à l'entité.
Notez que dans la base de données stockée uniquement ces propriétés, qui répondent aux exigences suivantes:
#### ColumnAttribute
ColumnAttribute peut être appliqué à la propriété de l'entité pour indiquer que cette propriété doit être stockée dans une base de données.
ColumnAttribute contient des propriétés suivantes:
public string Name { get ; set ; } Indiquez que la propriété de l'entité (colonne) doit être stockée dans une base de données avec un autre nom, plus court, d'exemple. Si la valeur n'est pas fournie, il sera alors utilisé le nom de la propriété en classe d'entité. Par exemple, dans ce cas
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } La propriété sera stockée comme «ID» et dans ce cas
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } comme «IdentificationNumber».
public bool IsPrimaryKey { get ; set ; } Indiquez que la colonne est la clé primaire. Vous pouvez décrire les clés primaires complexes en appliquant ColumnAttribute (avec des propriétés IsPrimaryKey définies sur true) sur plusieurs colonnes. Framework gère les clés primaires et lancera GlobalsDbException ("Violation de la contrainte de clé primaire. Impossible d'insérer une clé en double") si vous essayez d'insérer des entités avec les mêmes clés primaires.
public bool IsDbGenerated { get ; set ; } Indiquez que la colonne de clé primaire est l'identité, c'est-à-dire générée par Framework. Il prend en charge uniquement les types entiers ( Int16 , Int32 et Int64 ).
Il existe des règles pour appliquer ColumnAttribute en entités:
IsPrimaryKey Property of ColumnAttributeshort , int ou long ) pris en charge en tant que colonne DbGeneratedDbGenerated est autoriséeDbGenerated ou les clés primaires personnalisées sont autorisées Si ces règles ne sont pas respectées, EntityValidationException sera lancée. Si l'entité a une clé d'identité, Framework le générera, insérez l'entité à la base de données et définira sa valeur sur colonne qui est marqué en clé d'identité.
#### dbSetAttribute
DBSetAttribute peut être appliqué à la classe Tentity. Cet attribut ne décrit une seule propriété
public string Name { get ; set ; }Indiquez que Global For Entity in Globals Database doit avoir un autre nom. Utilisation similaire à l'utilisation de la même propriété dans ColumnAttribute.
L'application de DbSetAttribute à la classe Tentity n'est pas obligatoire.
#### DataconText
Classe abstraite qui fournit une connexion à la base de données. Vous devez créer une classe dérivée avec un ensemble de propriétés ou champs publics DbSet<TEntity> publics pour avoir accès aux données de la base de données.
La méthode publique déclarée SubmitChanges() soumet toutes les modifications avec la base de données que les utilisations ont réalisé avec les méthodes publiques de la classe DbSet<TEntity> (comme InsertOnSubmit(TEntity entity) ).
La classe DataContext a deux constructeurs protégés.
protected DataContext(string namespc, string user, string password)protected DataContext()#### GlobalsdbException
Framework lance le GlobalsDBException dans les cas suivants:
#### EntityValidationException
Framework lance EntityValidationException lorsque le client a déclaré une entité qui ne répond pas aux exigences suivantes:
IsPrimaryKey Property of ColumnAttributeshort , int ou long ) pris en charge en tant que colonne DbGeneratedDbGenerated est autoriséeDbGenerated ou les clés primaires personnalisées sont autorisées## Comment utiliser
Principalement, votre besoin de déclarer les classes du modèle de domaine. Dans cet exemple, le modèle de domaine se compose de quatre entités (pays, professeurs, université et ville) qui forme une hiérarchie complexe. Chaque propriété de l'entité, que vous devez être stockée dans la base de données doit être marquée par le ColumnAttrubute .
Ces entités ont été déclarées de cette manière:
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 ; }
} Comme vous pouvez le voir, chaque pays contient une liste de villes, toutes les villes contient une liste d'universités et chaque université contient une liste de facultés. ColumnAttribute est fourni pour chaque colonne qui doit être stockée dans la base de données.
Je vais stocker l'entité du pays dans la base de données et toutes les entités enfants seront automatiquement sérialisées dans les globaux de la base de données Caché. Selon les règles de ColumnAttribute , je dois déclarer la clé primaire pour le pays d'entité. J'ai donc marqué Name la propriété comme clé principale.
Pour fonctionner avec une entité de pays, vous avez d'abord besoin pour créer une classe dérivée de DataContext . Deuxièmement, vous devez déclarer la propriété DbSet<TEntity> dans la classe dérivée, où Type - Type d'entité que vous désirez stocker dans la base de données. J'ai déclaré la classe TestDataContext selon les règles mentionnées. Class TestDataContext n'a qu'un seul Countries de propriété publique.
J'ai également déclaré une constituante publique sans paramètres qui appelle le constructeur avec des informations d'identification de sécurité, donc l'utilisation de UniversityInfodataContext devient très pratique.
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} Pour manipuler les données, vous pouvez utiliser différentes méthodes de DbSet<TEntity> qui ont été décrites dans la section précédente. Notez que toutes les modifications appliquées uniquement lorsque la méthode de contexte SubmitChanges a été invoquée.
À titre d'exemple, la création d'une nouvelle entité de pays dans la base de données est très simple:
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}En outre, vous pouvez utiliser les requêtes LINQ pour obtenir des données à partir de la base de données. Par exemple, vous pouvez obtenir tous les pays qui ont plus d'une ville:
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}