LINQ API与.NET实体框架的CachéGlobals合作
##简介“ Globals EF”是著名数据库IntersystemsCaché的对象/关系映射(O/RM)框架。如您所知,CACHé数据库由极其有效的多维数据引擎供电。裸露的接口支持访问多维结构,提供了最高性能和最大的存储可能性。 Caché对于使用“大数据”的应用程序非常有用,如今,这些应用程序越来越多。带有C#编程语言的NET框架使开发人员的应用程序的创建和维护非常容易。因此,在.NET应用程序中使用SysystemsCaché轻松是实际任务。 Intersystems提供了Caché极限技术,可从.NET应用程序中访问Globals API,但创建应用程序仍然很耗时。因此,全球性EF的主要目的是简化与Caché和GlobalsDB合作。该框架的核心是IntersystemsCaché极端技术。所描述的框架提供了许多有用的功能,例如对象/关系映射,LINQ与Globals,并与Caché和GlobalsDB进行交互简单而无缝。
##安装
##公共API
#### dbset类
DbSet<TEntity>类代表用于创建,读取,更新和删除操作的实体。
该类实现IOrderedQueryable<TEntity>和IQueryProvider接口,因此您可以在DbSet<TEntity>实例上使用LINQ表达式从数据库中获取数据。由于实现了IOrderedQueryable<TEntity> ,您还可以使用排序查询,例如orderby,orderbydescending,当时或当时的byDestresgend。
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 ) ; 这些方法可用于使用数据执行相应的操作。您可以操纵单一实体或集合。
#### tentity
先前描述的类( DbSet<TEntity> )的通用参数表示您需要存储在数据库中的实体。暂定的限制 - 必须是班级,被宣布为公开。
在此类中,您可以声明与实体相对应的公共属性。
请注意,在数据库中仅存储这些属性,这些属性符合以下要求:
#### columnattribute
可以将ColumnAttribute应用于实体的属性以指示,必须将该属性存储在数据库中。
ColumnAttribute包含以下属性:
public string Name { get ; set ; } 表明实体(列)的属性必须存储在数据库中,其中其他名称Shorter(例如)。如果未提供值,则将在实体类中使用属性名称。例如,在这种情况下
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } 属性将被存储为“ ID”,在这种情况下
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } 作为“识别名称”。
public bool IsPrimaryKey { get ; set ; }指示该列是主要键。您可以通过将ColumnAttribute (将IsPrimaryKey属性设置为true)应用于几个列来描述复杂的主键。框架管理主键,并将抛出GlobalsDbException (“违反主要密钥约束。无法插入重复键”),如果您尝试使用相同的主键插入实体。
public bool IsDbGenerated { get ; set ; }表明主键列是身份,即通过框架生成。它仅支持整数类型( Int16 , Int32和Int64 )。
有一些在实体中应用ColumnAttribute的规则:
ColumnAttribute的IsPrimaryKey属性声明至少一个主要键DbGenerated列支持的积分类型( short , int或long )DbGenerated列DbGenerated主键或自定义主键如果不符合这些规则,则将抛出EntityValidationException 。如果实体具有身份密钥,则框架将生成它,将实体插入数据库,并将其值设置为标记为身份密钥的列。
#### dbsetattribute
DBSetAttribute可以应用于宗教类别。此属性仅描述一个属性
public string Name { get ; set ; }表明全球数据库中的实体全局必须具有另一个名称。使用类似于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当客户宣布不符合以下要求的实体时,将抛出EntityValidationException:
ColumnAttribute的IsPrimaryKey属性声明至少一个主要键DbGenerated列支持的积分类型( short , int或long )DbGenerated列DbGenerated主键或自定义主键##如何使用
首先,您需要声明域模型的类。在此示例中,域模型由四个实体(国家,教职员工,大学和城镇)组成,它们形成了复杂的层次结构。您需要存储在数据库中的实体中的每个属性都必须用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 。
我要将国家实体存储在数据库中,所有儿童实体将自动将其序列到CACHé数据库中的Globals序列化。根据ColumnAttribute的规则,我需要声明实体国家的主要密钥。因此,我将属性Name标记为主要键。
要使用国家实体运营,您首先需要创建DataContext的派生类别。其次,您需要在派生类中声明DbSet<TEntity>属性,其中暂定 - 您希望存储在数据库中的实体类型。我已经根据上述规则声明了TestDataContext类。类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 ( ) ;
}
}