LINQ API للعمل مع Caché Globals من .NET Entity Framwork
## مقدمة "Globals EF" هو إطار خرائط كائن/علائقية (O/RM) لـ Caché المعروفة. كما تعلمون ، يتم تشغيل قاعدة بيانات Caché بواسطة محرك بيانات متعدد الأبعاد فعال للغاية. تدعم الواجهة المكشوفة الوصول إلى الهياكل متعددة الأبعاد ، مما يوفر أعلى أداء وأكبر مجموعة من إمكانيات التخزين. يعد Caché مفيدًا جدًا للتطبيقات التي تعمل مع "البيانات الضخمة" وهناك المزيد والمزيد من هذه التطبيقات في الوقت الحاضر. .NET Framework مع لغة البرمجة C# يجعل إنشاء التطبيقات وصيانةها سهلة للغاية للمطورين. لذلك ، من السهل استخدام intersystems caché في تطبيقات .NET المهمة الفعلية. يوفر Intersystems تقنية Caché Extreme التي تتيح الوصول إلى Globals API من تطبيقات .NET ولكن إنشاء التطبيقات لا يزال مستهلكًا للوقت. لذلك ، الغرض الرئيسي من Globals EF هو تخفيف العمل مع Caché و GlobalsDB. جوهر هذا الإطار هو تقنية intersystems Caché Extreme. يوفر الإطار الموصوف الكثير من الوظائف المفيدة ، مثل التعيين الكائن/العلائقية ، LINQ إلى Globals ويجعل التفاعل مع Caché و GlobalsDB بسيط وسلس.
##تثبيت
## API العام
#### فئة DBSET
تمثل فئة DbSet<TEntity> كيانًا يتم استخدامه لإنشاء العمليات والقراءة والتحديث وحذفها.
ينفذ هذا الفصل واجهات IOrderedQueryable<TEntity> و IQueryProvider ، وبالتالي يمكنك استخدام تعبيرات LINQ على مثيل DbSet<TEntity> للحصول على البيانات من قاعدة البيانات. نظرًا لتنفيذ IOrderedQueryable<TEntity> ، يمكنك أيضًا استخدام استفسارات الفرز ، مثل Orderby أو OrderbyDescending أو thenbydesicing.
تقوم Class 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 ; } سيتم تخزين العقار كـ "معرف" وفي هذه الحالة
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } كـ "التعريف".
public bool IsPrimaryKey { get ; set ; } تشير إلى أن العمود هو المفتاح الأساسي. يمكنك وصف المفاتيح الأولية المعقدة عن طريق تطبيق ColumnAttribute (مع تعيين خاصية IsPrimaryKey على True) إلى عدة أعمدة. يدير Framework المفاتيح الأولية وسيقوم بإلقاء GlobalsDbException ("انتهاك القيد الرئيسي الأساسي. لا يمكن إدراج مفتاح مكرر") إذا حاولت إدراج الكيانات ذات المفاتيح الأساسية نفسها.
public bool IsDbGenerated { get ; set ; } تشير إلى أن عمود المفتاح الأساسي هو الهوية ، أي أنشأها الإطار. وهو يدعم أنواع عدد صحيح فقط ( Int16 و Int32 و Int64 ).
هناك بعض القواعد لتطبيق ColumnAttribute في الكيانات:
IsPrimaryKey من ColumnAttributeshort ، int أو long ) مدعومة كعمود DbGeneratedDbGeneratedDbGenerated مسموح بها إذا لم يتم استيفاء هذه القواعد ، فسيتم طرح EntityValidationException . إذا كان الكيان يحتوي على مفتاح هوية ، فسيقوم Framework بإنشاءه ، وإدراج الكيان في قاعدة البيانات وضبط قيمته على العمود الذي تم وضع علامة عليه كمفتاح هوية.
#### DBSETATTRIBUTE
يمكن تطبيق DBSETATTRIBUTE على فئة الخيمة. تصف هذه السمة خاصية واحدة فقط
public string Name { get ; set ; }تشير إلى أن قاعدة بيانات Global for Contity in Globals يجب أن يكون لها اسم آخر. الاستخدام المشابه لاستخدام نفس الخاصية في 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 عندما أعلن العميل الكيان الذي لا يفي بالمتطلبات التالية:
IsPrimaryKey من ColumnAttributeshort ، int أو long ) مدعومة كعمود DbGeneratedDbGeneratedDbGenerated مسموح بها## كيفية الاستخدام
في المقام الأول ، حاجتك إلى إعلان فصول نموذج المجال. في هذا المثال ، يتكون نموذج المجال من أربعة كيانات (البلد ، أعضاء هيئة التدريس ، الجامعة والمدينة) التي تشكل التسلسل الهرمي المعقد. يجب وضع علامة على كل خاصية في الكيان ، والتي تحتاج إلى تخزينها في قاعدة البيانات مع 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é تلقائيًا. وفقًا لقواعد ColumnAttribute ، أحتاج إلى إعلان المفتاح الأساسي لبلد الكيان. لذلك قمت بتمييز Name الخاصية كمفتاح أساسي.
للعمل مع كيان البلد ، تحتاج ، في البداية ، لإنشاء فئة مشتقة من DataContext . ثانياً ، تحتاج إلى إعلان خاصية DbSet<TEntity> في الفئة المشتقة ، حيث النوع - نوع الكيان الذي ترغب في تخزينه في قاعدة البيانات. لقد أعلنت فئة TestDataContext وفقًا للقواعد المذكورة. لدى Class 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 ( ) ;
}
}