API LINQ para trabajar con Caché Globals de .NET Entity Framwork
## Introducción "Globals EF" es un marco de mapeo de objeto/relacional (O/RM) para el conocido Caché de Intersystems de base de datos. Como saben, la base de datos de Caché funciona con un motor de datos multidimensional extremadamente eficiente. La interfaz expuesta admite el acceso a las estructuras multidimensionales, proporcionando el mayor rendimiento y la mayor gama de posibilidades de almacenamiento. Caché es muy útil para aplicaciones que funcionan con "Big Data" y hay cada vez más estas aplicaciones hoy en día. .NET Framework con lenguaje de programación de C# hace que la creación y mantenimiento de aplicaciones sea muy fácil para los desarrolladores. Por lo tanto, el uso fácil de usar el Caché Intersystems en aplicaciones .NET es la tarea real. Intersystems proporciona tecnología extrema de Caché que brinda acceso a la API global de aplicaciones .NET, pero la creación de aplicaciones aún lleva mucho tiempo. Entonces, el objetivo principal de Globals EF es aliviar el trabajo con Caché y Globalsdb. El núcleo de este marco es la tecnología Intersystems Caché Extreme. El marco descrito proporciona muchas funciones útiles, como mapeo de objetos/relacionales, LINQ a Globals y hace que la interacción con Caché y GlobalsDB sea simple y sin problemas.
##Instalación
## API pública
#### clase dbset
La clase DbSet<TEntity> representa una entidad que se usa para las operaciones Crear, Leer, Actualizar y Eliminar.
Esta clase implementa las interfaces de IOrderedQueryable<TEntity> e IQueryProvider , por lo tanto, puede usar expresiones LINQ en la instancia DbSet<TEntity> para obtener datos de la base de datos. Debido a la implementación de IOrderedQueryable<TEntity> , también puede usar consultas de clasificación, como Orderby, OrderByDescending, luego, o luego, por favor.
La clase DBSET también implementa la interfaz IDbSet<TEntity> que declara los siguientes 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 ) ; Estos métodos se pueden utilizar para realizar las operaciones correspondientes con datos. Puede manipular una entidad única o un conjunto de entidades.
#### Tentidad
El parámetro genérico para la clase descrita anteriormente ( DbSet<TEntity> ) representa la entidad que necesita almacenar en una base de datos. Restricción para la tentidad: debe ser una clase, declarada como pública.
En esta clase puede declarar propiedades públicas que corresponden a la entidad.
Tenga en cuenta que en la base de datos almacenó solo aquellas propiedades, que cumplen con los siguientes requisitos:
#### columnattribute
ColumnAttribute se puede aplicar a la propiedad de la entidad para indicar que esta propiedad debe almacenarse en una base de datos.
ColumnAttribute contiene las siguientes propiedades:
public string Name { get ; set ; } Indique que la propiedad de la entidad (columna) debe almacenarse en una base de datos con otro nombre, más corto, de ejemplo. Si no se proporciona valor, se utilizará el nombre de la propiedad en la clase Entity. Por ejemplo, en este caso
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } La propiedad se almacenará como "ID" y en este caso
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } como "IdentificationNumber".
public bool IsPrimaryKey { get ; set ; } Indique que la columna es la clave principal. Puede describir claves primarias complejas aplicando ColumnAttribute (con la propiedad IsPrimaryKey establecida en True) a varias columnas. Framework gestiona las claves primarias y lanzará GlobalsDbException ("Violación de la restricción de la clave primaria. No se puede insertar la clave duplicada") si intenta insertar entidades con las mismas claves primarias.
public bool IsDbGenerated { get ; set ; } Indique que la columna de clave primaria es identidad, es decir, generada por el marco. Apoya solo los tipos enteros ( Int16 , Int32 e Int64 ).
Hay algunas reglas para aplicar ColumnAttribute en entidades:
IsPrimaryKey de ColumnAttributeshort , int o long ) admitidos como columna DbGeneratedDbGeneratedDbGenerated o las teclas primarias personalizadas Si no se cumplen estas reglas, EntityValidationException se lanzará. Si la entidad tiene la clave de identidad, Framework lo generará, inserte la entidad en la base de datos y establecerá su valor en la columna que marcó como clave de identidad.
#### dbsetattribute
DBSETATTRIBUTE se puede aplicar a la clase Tentity. Este atributo describe solo una propiedad
public string Name { get ; set ; }Indique que Global para la base de datos de la entidad en Globals debe tener otro nombre. Uso similar al uso de la misma propiedad en ColumnAttribute.
La aplicación de DbSetAttribute a la clase de tentidad no es obligatoria.
#### DataContext
Clase abstracta que proporciona conexión a la base de datos. Debe crear una clase derivada con un conjunto de propiedades o campos de DbSet<TEntity> Public para obtener acceso a los datos de la base de datos.
El método público declarado SubmitChanges() envía todos los cambios con la base de datos que los usos han realizado con métodos públicos de clase DbSet<TEntity> (como InsertOnSubmit(TEntity entity) ).
La clase DataContext tiene dos constructores protegidos.
protected DataContext(string namespc, string user, string password)protected DataContext()#### Globalsdbexception
El marco arroja la GlobalsDBException en los siguientes casos:
#### EntityValidationException
Framework lanza EntityValidationException cuando el cliente ha declarado entidad que no cumple con los siguientes requisitos:
IsPrimaryKey de ColumnAttributeshort , int o long ) admitidos como columna DbGeneratedDbGeneratedDbGenerated o las teclas primarias personalizadas## Cómo usar
Principalmente, su necesidad de declarar las clases del modelo de dominio. En este ejemplo, el modelo de dominio consta de cuatro entidades (país, facultad, universidad y ciudad) que forma jerarquía compleja. Cada propiedad en la entidad, que debe almacenarse en la base de datos debe marcarse con el ColumnAttrubute .
Estas entidades han sido declaradas de esa manera:
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 puede ver, cada país contiene una lista de ciudades, cada ciudad contiene una lista de universidades y cada universidad contiene una lista de facultades. ColumnAttribute se suministra para cada columna que debe almacenarse en la base de datos.
Voy a almacenar la entidad del país en la base de datos y todas las entidades infantiles se serializarán a los globales en la base de datos de Caché automáticamente. De acuerdo con las reglas de ColumnAttribute , necesito declarar la clave principal para el país de la entidad. Entonces marcé Name de la propiedad como clave principal.
Para operar con la entidad de país, al principio, para crear una clase derivada de DataContext . En segundo lugar, debe declarar la propiedad DbSet<TEntity> en la clase derivada, donde Tentity - Tipo de entidad que desea almacenar en la base de datos. He declarado la clase TestDataContext de acuerdo con las reglas mencionadas. La clase TestDataContext tiene solo un Countries de propiedad pública.
También he declarado un constructor público sin parámetros que llama al constructor con credenciales de seguridad, por lo que el uso de UniversityInfodataContext se vuelve muy conveniente.
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} Para manipular datos, puede usar diferentes métodos de DbSet<TEntity> que se han descrito en la sección anterior. Tenga en cuenta que todos los cambios aplicados solo cuando se han invocado el método de contexto SubmitChanges .
Como ejemplo, crear una nueva entidad de país en la base de datos es muy simple:
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}Además, puede usar consultas LINQ para obtener datos de la base de datos. Por ejemplo, puede obtener todos los países que tienen más de una ciudad:
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}