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 ( ) ;
}
}