LINQ API untuk bekerja dengan Caché Globals dari .NET Entity Framwork
## PENDAHULUAN "Globals EF" adalah kerangka Object/Relational Mapping (O/RM) untuk Caché Intersystems Database yang terkenal. Seperti yang Anda ketahui, database Caché ditenagai oleh mesin data multidimensi yang sangat efisien. Akses dukungan antarmuka yang terpapar ke struktur multidimensi, memberikan kinerja tertinggi dan berbagai kemungkinan penyimpanan. Caché sangat berguna untuk aplikasi yang bekerja dengan "data besar" dan ada semakin banyak aplikasi ini saat ini. .NET Framework dengan bahasa pemrograman C# membuat pembuatan dan pemeliharaan aplikasi sangat mudah bagi pengembang. Oleh karena itu, mudah menggunakan InterSystems Caché di aplikasi .NET adalah tugas yang sebenarnya. Intersystems menyediakan teknologi ekstrem Caché yang memberikan akses ke API global dari aplikasi .NET tetapi membuat aplikasi masih memakan waktu. Jadi, tujuan utama Globals EF adalah untuk memudahkan bekerja dengan Caché dan GlobalsDB. Inti dari kerangka kerja ini adalah Intersystems Caché Extreme Technology. Kerangka kerja yang dijelaskan menyediakan banyak fungsi yang berguna, seperti pemetaan objek/relasional, LINQ ke global dan membuat interaksi dengan Caché dan GlobalsDB sederhana dan mulus.
##Instalasi
## API Publik
Kelas #### DBSET
Kelas DbSet<TEntity> mewakili entitas yang digunakan untuk membuat, membaca, memperbarui, dan menghapus operasi.
Kelas ini mengimplementasikan antarmuka IOrderedQueryable<TEntity> dan IQueryProvider , oleh karena itu Anda dapat menggunakan Ekspresi LINQ pada instance DbSet<TEntity> untuk mendapatkan data dari database. Karena implementasi IOrderedQueryable<TEntity> , Anda juga dapat menggunakan kueri penyortiran, seperti OrderBy, OrderByDescending, Thenby atau ThenbyDescending.
Kelas DBSET juga mengimplementasikan antarmuka IDbSet<TEntity> yang menyatakan metode berikut:
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 ) ; Metode ini dapat digunakan untuk melakukan operasi yang sesuai dengan data. Anda dapat memanipulasi entitas tunggal atau serangkaian entitas.
#### Tentity
Parameter generik untuk kelas yang dijelaskan sebelumnya ( DbSet<TEntity> ) mewakili entitas yang perlu Anda simpan dalam database. Pembatasan untuk tentitas - harus menjadi kelas, dinyatakan sebagai publik.
Di kelas ini Anda dapat mendeklarasikan properti publik yang sesuai dengan entitas.
Perhatikan bahwa dalam database hanya menyimpan properti tersebut, yang memenuhi persyaratan berikut:
#### ColumnAttribute
ColumnAttribute dapat diterapkan pada properti entitas untuk menunjukkan, bahwa properti ini harus disimpan dalam database.
ColumnAttribute berisi properti berikut:
public string Name { get ; set ; } Menunjukkan bahwa properti entitas (kolom) harus disimpan dalam database dengan nama lain, lebih pendek, contoh. Jika nilai tidak disediakan, maka akan digunakan nama properti di kelas entitas. Misalnya, dalam hal ini
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } Properti akan disimpan sebagai "id" dan dalam hal ini
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } sebagai "IdentificationNumber".
public bool IsPrimaryKey { get ; set ; } Tunjukkan bahwa kolom adalah kunci utama. Anda dapat menggambarkan tombol primer yang kompleks dengan menerapkan ColumnAttribute (dengan properti IsPrimaryKey diatur ke True) ke beberapa kolom. Framework mengelola kunci utama dan akan melempar GlobalsDbException ("Pelanggaran Kunci Kunci Primer. Tidak dapat memasukkan Kunci Duplikat") jika Anda mencoba memasukkan entitas dengan kunci primer yang sama.
public bool IsDbGenerated { get ; set ; } Menunjukkan bahwa kolom kunci primer adalah identitas, yaitu yang dihasilkan oleh kerangka kerja. Ini hanya mendukung jenis integer ( Int16 , Int32 dan Int64 ).
Ada beberapa aturan untuk menerapkan ColumnAttribute di Entitas:
IsPrimaryKey dari ColumnAttributeshort , int atau long ) yang didukung sebagai kolom DbGeneratedDbGenerated yang diizinkanDbGenerated atau kunci primer kustom diizinkan Jika aturan ini tidak terpenuhi, EntityValidationException akan dilemparkan. Jika entitas memiliki kunci identitas, kerangka kerja akan menghasilkannya, masukkan entitas ke database dan atur nilainya ke kolom yang ditandai sebagai kunci identitas.
#### DBSEtAttribute
DBSetAttribute dapat diterapkan pada kelas tentitas. Atribut ini hanya menjelaskan satu properti
public string Name { get ; set ; }Menunjukkan bahwa global untuk entitas dalam database global harus memiliki nama lain. Penggunaan mirip dengan penggunaan properti yang sama di ColumnAttribute.
Menerapkan DbSetAttribute ke kelas Tentity tidak wajib.
#### DataContext
Kelas abstrak yang menyediakan koneksi ke database. Anda perlu membuat kelas turunan dengan set DbSet<TEntity> Properti atau bidang publik untuk mendapatkan akses ke data database.
Metode publik yang dinyatakan SubmitChanges() mengirimkan semua perubahan dengan database yang digunakan telah dibuat dengan metode publik kelas DbSet<TEntity> (seperti InsertOnSubmit(TEntity entity) ).
Kelas DataContext memiliki dua konstruktor yang dilindungi.
protected DataContext(string namespc, string user, string password)protected DataContext()#### GlobalSDBException
Kerangka kerja melempar GlobalSDBException dalam kasus -kasus berikut:
#### EntityValidationException
Kerangka Melempar EntityValidationException Ketika Pelanggan telah menyatakan entitas yang tidak memenuhi persyaratan berikut:
IsPrimaryKey dari ColumnAttributeshort , int atau long ) yang didukung sebagai kolom DbGeneratedDbGenerated yang diizinkanDbGenerated atau kunci primer kustom diizinkan## Cara menggunakan
Terutama, kebutuhan Anda untuk mendeklarasikan kelas model domain. Dalam contoh ini, model domain terdiri dari empat entitas (negara, fakultas, universitas dan kota) yang membentuk hierarki yang kompleks. Setiap properti di entitas, yang harus Anda simpan dalam database harus ditandai dengan ColumnAttrubute .
Entitas tesis telah dinyatakan dengan cara itu:
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 ; }
} Seperti yang Anda lihat, setiap negara berisi daftar kota, setiap kota berisi daftar universitas dan setiap universitas berisi daftar fakultas. ColumnAttribute disediakan untuk setiap kolom yang perlu disimpan dalam database.
Saya akan menyimpan entitas negara dalam database dan semua entitas anak akan diserialisasi ke global dalam database Caché secara otomatis. Menurut aturan ColumnAttribute , saya perlu mendeklarasikan kunci utama untuk negara entitas. Jadi saya menandai Name properti sebagai kunci utama.
Untuk beroperasi dengan entitas negara yang Anda butuhkan, pada awalnya, untuk membuat kelas DataContext yang diturunkan. Kedua, Anda perlu mendeklarasikan properti DbSet<TEntity> di kelas turunan, di mana tentitas - jenis entitas yang Anda inginkan untuk disimpan dalam database. Saya telah mendeklarasikan kelas TestDataContext sesuai dengan aturan yang disebutkan. TestDataContext kelas hanya memiliki satu Countries properti publik.
Saya juga telah mendeklarasikan konstuktor tanpa parameter publik yang memanggil konstruktor dengan kredensial keamanan, sehingga menggunakan UniversityInfodatacontext menjadi sangat nyaman.
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} Untuk memanipulasi data, Anda dapat menggunakan berbagai metode DbSet<TEntity> yang telah dijelaskan pada bagian sebelumnya. Perhatikan, bahwa setiap perubahan yang diterapkan hanya ketika metode konteks SubmitChanges telah dipanggil.
Sebagai contoh, membuat entitas negara baru dalam database sangat sederhana:
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}Juga, Anda dapat menggunakan kueri LINQ untuk mendapatkan data dari database. Misalnya, Anda bisa mendapatkan semua negara yang memiliki lebih dari satu kota:
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}