.NET Entity FramworkのCachéGlobalsと連携するLinqAPI
##はじめに「Globals EF」は、よく知られているデータベースインターシステムのCachéのオブジェクト/リレーショナルマッピング(O/RM)フレームワークです。ご存知のように、Cachéデータベースは非常に効率的な多次元データエンジンを搭載しています。露出したインターフェイスは、多次元構造へのアクセスをサポートし、最高のパフォーマンスと最大のストレージの可能性を提供します。 Cachéは、「ビッグデータ」で動作するアプリケーションに非常に役立ち、最近ではこれらのアプリケーションがますます増えています。 C#プログラミング言語を使用した.NETフレームワークにより、アプリケーションの作成とメンテナンスが開発者にとって非常に簡単になります。したがって、.NETアプリケーションでシステム間カチェを簡単に使用することは実際のタスクです。 Intersystemsは、.NETアプリケーションからGlobals APIへのアクセスを提供するCachéExtremeテクノロジーを提供しますが、アプリケーションの作成はまだ時間がかかります。したがって、Globals EFの主な目的は、CachéとGlobalsDBの操作を容易にすることです。このフレームワークのコアは、インターシステムのCachéExtremeTechnologyです。記述されたフレームワークは、オブジェクト/リレーショナルマッピング、GlobalsへのLinqなど、多くの有用な機能を提供し、CachéやGlobalsDBとの相互作用をシンプルでシームレスにします。
##インストール
## public API
#### dbsetクラス
DbSet<TEntity>クラスは、操作の作成、読み取り、更新、削除に使用されるエンティティを表します。
このクラスは、 IOrderedQueryable<TEntity>およびIQueryProviderインターフェイスを実装するため、データベースからデータを取得するためにDbSet<TEntity>インスタンスでlinq式を使用できます。 IOrderedQueryable<TEntity>の実装により、Orderby、OrderByDessend、Then By、またはThenbyDessendなどのソートクエリを使用することもできます。
クラス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 ; } エンティティ(列)のプロパティは、例の短い名前を持つデータベースに保存する必要があることを示します。値が提供されていない場合、エンティティクラスでプロパティの名前が使用されます。たとえば、この場合
[ 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プロパティで少なくとも1つの主キーを宣言する必要がありますDbGeneratedカラムとしてサポートされている積分タイプ( short 、 int 、またはlong )のみDbGenerated列のみが許可されますDbGeneratedプライマリキーまたはカスタムプライマリキーが許可されていますこれらのルールが満たされていない場合、 EntityValidationExceptionがスローされます。エンティティにIDキーがある場合、フレームワークはそれを生成し、エンティティをデータベースに挿入し、その値をIDキーとしてマークされた列に設定します。
#### dbsetattribute
DBSETATTRIBUTEは、Tentityクラスに適用できます。この属性は、1つのプロパティのみを記述します
public string Name { get ; set ; }Globals Databaseのエンティティのグローバルは、別の名前が必要であることを示します。 columnAttributeで同じプロパティを使用するのと同様の使用。
DbSetAttributeテンティティクラスに適用することは義務ではありません。
#### datacontext
データベースへの接続を提供する抽象クラス。データベースデータにアクセスするために、 DbSet<TEntity>パブリックプロパティまたはフィールドのセットを使用して、派生クラスを作成する必要があります。
宣言されたパブリックメソッドSubmitChanges() DbSet<TEntity>クラスのパブリックメソッド( InsertOnSubmit(TEntity entity)など)で作成されたデータベースですべての変更を提出します。
DataContextクラスには、2つの保護されたコンストラクターがあります。
protected DataContext(string namespc, string user, string password)protected DataContext()#### globalsdbexception
フレームワークは、以下の場合にGlobalsDBexceptionをスローします。
#### EntityValidationException
Frameworkは、顧客が次の要件を満たさないエンティティを宣言したときにEntityValidationExceptionをスローします。
ColumnAttributeのIsPrimaryKeyプロパティで少なくとも1つの主キーを宣言する必要がありますDbGeneratedカラムとしてサポートされている積分タイプ( short 、 int 、またはlong )のみDbGenerated列のみが許可されますDbGeneratedプライマリキーまたはカスタムプライマリキーが許可されています##使い方
主に、ドメインモデルのクラスを宣言する必要があります。この例では、ドメインモデルは、複雑な階層を形成する4つのエンティティ(国、教員、大学、町)で構成されています。データベースに保存する必要があるエンティティ内のすべてのプロパティは、 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 1つしかありません。
また、セキュリティ資格情報を持つコンストラクターを呼び出す公開パラメーターレス構造者を宣言しました。したがって、UniversionFodatacontextの使用は非常に便利になります。
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 ( ) ;
}
}