الكيان الإطار الأساسي تحقيق عامل تصفية الاستعلام العالمي

الكاتب | ر مواء

ذبيان | ليو جينغ

أنتجت | CSDN (ID: CSDNnews)

عرضت شركة مايكروسوفت المرشحات الاستعلام العالمية في إطار الكيان الأساسية 2+، وتبسيط التعقيد من بناء تطبيقات متعددة المستأجر وكيان حذف ناعمة. هذه المقالة سوف يشرح بالتفصيل تصفيتها من خلال الاستعلام العالمي في التعليمات البرمجية. أمامنا أولا شرح بإيجاز عن ما هو متعددة المستأجر، متعدد المستأجر يطلق عليه ببساطة يشير إلى نسخة منفصلة يمكن خدمة المنظمات متعددة. التكنولوجيا داخل متعددة المستأجر المشتركة مركز البيانات في بنية النظام واحدة، وكيف أن مزود خدمة يمكن أن تكون نفس أو حتى معظم عملاء الخدمات المخصصة، والتي لا تزال حماية العزلة بيانات العميل.

بعد ذلك، دعونا ننظر في في كمثال على ذلك، ونحن نفترض أن المستأجرين متعددة استخدام نفس قاعدة البيانات، وهو نفس المخطط، للتمييز بين المستأجرين ويستند على الطاولة الدار تمييز. ونحن إنشاء مشروع جديد، DbContext في سياق تجاوز أسلوب OnModelCreating في المشروع، في هذه الطريقة نستخدم أساليب HasQueryFilter إزالة لينة.

EFContext الطبقة الجمهور: DbContext { تجاوز محمية الفراغ OnModelCreating (ModelBuilder modelBuilder) { modelBuilder.Entity < عامل > .HasQueryFilter (ع = >  ! P.IsDelete)؛ modelBuilder.Entity < قسم > .HasQueryFilter (ع = >  ! P.IsDelete)؛ base.OnModelCreating (modelBuilder)؛ } }

رمز أعلاه معظم الناس يشاهدون يجب أن تشعر أن هناك أي مشكلة، ولكن أريد أن أقول لكم أن هذا الرمز هو مشكلة كبيرة هو أنه في كل مرة أذهب الموظف العملية أو كيان زارة ستكون HasQueryFilter التطبيقية، ثم إذا بالعشرات نموذج أو مئات بل مرات، لو وصفت الطريقة أعلاه إلى رمز الكتابة، ثم سنقوم بتكوين عشرات HasQueryFilter مئات المرات. لذا فإن السؤال هو، مع هذه الحالة، كيف ينبغي لنا أن دعم متعددة المستأجر، وكيف ينبغي تحقيق ناعمة حذف، الاستعلام وكيف يمكن للنموذج ينبغي أن يحقق تصفية الكشف التلقائي. هنا نأتي إلى مشكلة مشكلة لشرح.

رمز قاعدة جاهزة

ونحن على استعداد لأول مرة نموذج رمز، رمز بسيط جدا:

/// < ملخص > /// الفئة الأساسية كيان /// < / ملخص > الطبقة العامة BaseModel { الباحث العام رقم {الحصول؛ مجموعة؛} // المستأجرين رقم الباحث العام الدار {الحصول؛ مجموعة؛} // حذف (حذف لينة) IsDelete منطقي العامة {الحصول؛ مجموعة؛} } /// < ملخص > /// فئة الموظفين /// < / ملخص > موظف الفئة العامة: BaseModel { اسم سلسلة العامة {الحصول؛ مجموعة؛} العام كثافة العمليات العمر {الحصول؛ مجموعة؛} وزارة الإدارة العامة {الحصول؛ مجموعة؛} } /// < ملخص > /// الطبقة قسم /// < / ملخص > وزارة الطبقة العامة: BaseModel { DepName سلسلة الجمهور {الحصول؛ مجموعة؛} الموظف كثافة العمليات العامة {الحصول؛ مجموعة؛} }

الآن ونحن ندرك موظف رسم الخرائط نموذج وزارة:

EmployeeConfiguration الطبقة الجمهور: IEntityTypeConfiguration < عامل > { الجمهور الفراغ تكوين (EntityTypeBuilder < عامل >  منشئ) { builder.ToTable ( "الموظف")؛ builder.HasKey (ع = >  p.Id)؛ builder.Property (ع = >  p.Name)؛ builder.Property (ع = >  p.IsDelete)؛ builder.Property (ع = >  p.Age)؛ builder.HasQueryFilter (ع = >  ! P.IsDelete)؛ } } DepartmentConfiguration الطبقة الجمهور: IEntityTypeConfiguration < قسم > { الجمهور الفراغ تكوين (EntityTypeBuilder < قسم >  منشئ) { builder.ToTable ( "وزارة")؛ builder.HasKey (ع = >  p.Id)؛ builder.Property (ع = >  p.DepName)؛ builder.Property (ع = >  p.IsDelete)؛ builder.HasQueryFilter (ع = >  ! P.IsDelete)؛ builder.HasMany (ع = >  p.Employees) .WithOne (ه = >  e.Department) .HasForeignKey (ك = >  k.DepartmentId)؛ } }

التالي نحدد واجهة رقم متعددة المستأجر وتنفيذها لتحقيق في قيمة العائد من المقرر أن يموت من أجل المستأجرين كشف التناظرية المقترنة الطلب الحالي.

الواجهة العمومية ITenantProvider { الباحث GetTId. } TenantProvider الطبقة الجمهور: ITenantProvider { الباحث العام GetTId { العودة 1؛ } }

وأخيرا، فإننا تحديد واجهة وتنفيذ إدارة الاستعلام:

الواجهة العمومية IDepartmentDb { IQueryable < قسم >  GetDepartments. } DepartmentDb الطبقة الجمهور: IDepartmentDb { EF EFContext الخاص؛ الجمهور DepartmentDb (EFContext _ef) { EF = _ef. } الجمهور IQueryable < قسم >  GetDepartments { الإدارات فار = ef.Departments. العودة الإدارات. } }

المتطلبات الأساسية

إذا كنت ترغب في تكوين مرشحات الاستعلام العالمية لجميع الكيانات يجب أن تكون قادرة على الكشف عن تلقائيا نوع الكيان، ويجب أن يكون الدعم عندما يكون نوع مخبأ الكشف. وبناء على هذه اثنين من الحصول على أيدينا لخلق نوع من التفاعل وتنفيذ الكيان. أولا، الحصول على وقت التشغيل، سيتم إضافة DependencyContext التجميع التجميع إلى جمع، ومن ثم معرفة ما يلي التجمع Chengzi جي الدرجة BaseModel، إذا كان العثور على هذه العودة، إذا لم يتم العثور على إعمال مخبأ مرشح العالمي، على النحو التالي:

الواجهة العمومية IEntityTypeProvider { IEnumerable < نوع >  GetTypes. } EntityTypeProvider الطبقة الجمهور: IEntityTypeProvider { IList < نوع >  entityTypeCache. الجمهور IEnumerable < نوع >  GetTypes { إذا (entityTypeCache! =) { العودة entityTypeCache.ToList. } entityTypeCache = (من في GetReferencingAssemblies من تي في a.DefinedTypes حيث t.BaseType == تشير typeof (BaseModel) حدد t.AsType) .ToList. العودة entityTypeCache. } IEnumerable الخاص < جمعية >  GetReferencingAssemblies { المجالس فار = قائمة جديدة < جمعية > . تبعيات فار = DependencyContext.Default.RuntimeLibraries. foreach (مكتبة فار في تبعيات) { فار = التجمع Assembly.Load (AssemblyName الجديد (library.Name))؛ assemblies.A دد (الجمعية)؛ } العودة المجالس. } }

تطبيق

القسم السابق نجد كل الكيانات ترث الفئة الأساسية، وحتى الآن نحن سيتم تطبيق مرشح للكيان العالمي.

الخطوة الأولى، والحصول على المقابلة أمام والمستأجر الهوية التي تحققت، وضخت في سياق المنشئ:

EFContext الطبقة الجمهور: DbContext { الجمهور DbSet < عامل >  الموظفين. الجمهور DbSet < قسم >  الإدارات. تجاوز محمية الفراغ OnModelCreating (ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration (EmployeeConfiguration جديد). modelBuilder.ApplyConfiguration (DepartmentConfiguration جديد). base.OnModelCreating (modelBuilder)؛ } الدار كثافة العمليات الخاصة. خاصة IEntityTypeProvider entityTypeProvider. الجمهور EFContext (DbContextOptions < EFContext >  خيارات، ITenantProvider tenantProvider، IEntityTypeProvider entityTypeProvider): قاعدة (خيارات) { الدار = tenantProvider.GetTId. this.entityTypeProvider = entityTypeProvider. } }

خطوة 2. تحديد استعلام العالمي تصفيتها أسلوب عام في هذا السياق:

GlobalQuery الفراغ الجمهور < تي >  (ModelBuilder باني) حيث T: BaseModel { builder.Entity < تي > .HasQueryFilter (ه = >  e.TId == الدار && e.IsDelete) !؛ }

ثم يكتسب تصفية طريقة توفير إطار الاستعلام العالمي الطبقة MethodInfo:

ثابت للقراءة فقط MethodInfo GlobalQueryMethod = تشير typeof (EFContext) .GetMethods (BindingFlags.Public | BindingFlags.Instance) .Single (ع = > p.IsGenericMethod && p.Name == "GlobalQuery")؛

وأخيرا، في طريقة OnModelCreating التي حصلت عليها ضرورة حقن entityTypeProvider مجموعة عالمية من أنواع الاستعلام من الترشيح، واجتاز دعوة للحصول على الاستعلام لتصفية معلمات الأسلوب modelBuilder واردة، من أجل تحقيق مرشحات الاستعلام متعددة المستأجر.

تجاوز محمية الفراغ OnModelCreating (ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration (EmployeeConfiguration جديد). modelBuilder.ApplyConfiguration (DepartmentConfiguration جديد). foreach (البند فار في entityTypeProvider.GetTypes) { طريقة فار = GlobalQueryMethod.MakeGenericMethod (البند)؛ method.Invoke (هذا الكائن الجديد {modelBuilder})؛ } base.OnModelCreating (modelBuilder)؛ }

ملخص

هذه المادة هي ببساطة لتحقيق متعددة المستأجر، والسيناريوهات الطبيب التجارية مشاريع أكثر تعقيدا الناعمة الحذف، نحن بحاجة إلى استخدام بعض أساليب خاصة لتحقيق مرشحات الاستعلام العالمية. ما سبق ذكره طريقة واحدة فقط، لا يستبعد بطريقة أفضل.

نبذة عن الكاتب: تشو الصلب القلم اسم مواء ر، CSDN بلوق خبير، وصافي مهندس التنمية كبار و 7 سنوات من الخبرة في مجال التنمية في الخطوط الأمامية، وشارك في تطوير نظم الحكومة الإلكترونية وأنظمة خدمة العملاء AI، والهندسة المعمارية موقع التوظيف الإنترنت، أعمل حاليا في بكين ديفيد Carse، وهوى المالية تطوير التكنولوجيا المحدودة، وتعمل في مجال تطوير نظم الضمان على مستوى المؤسسات والمراقبة.

تنويه: هذه المادة الكاتب آراء مستقلة لا تمثل موقف CSDN.

[END]

طلاب ينزهو اجتاحت محافظة وطنية للتثقيف دفاع مسابقة المعرفة المركز الأول في ثلاث فئات

"بوابة ليس ومضة في عموم!"

جيانغ شي Jingan: "بيئة الجمال" إنجاز "الاقتصادية الغنية"

في تايلاند، فإن السكان المحليين لا اقول لكم الطعام الشارع

"ثلاثة خنازير صغيرة" سمعت ذلك، ينزهو طلاب هذه المدرسة الابتدائية القص حقا المسوق

PHP حيا أو ميتا؟

مظاهرة نقطة على غرار المعرض ICBC القلب ينزهو فرع مكتب 76 ثواني لجعل خدمة أفضل من أكثر حداثة

كيف تتواصل مع التايلانديين بسرعة عند السفر إلى تايلاند؟

التسوق المرح وراء تطور التكنولوجيا: 2-11 علي 11 عاما

التفسير: التايلاندية تأشيرة طالب (غير مهاجر-ED تأشيرة) التعامل مع تعليمات

80000-يد واحدة الحد الإغلاق! سهم Zhangzidao انخفضت 82، أثار هرب تقريبا، والمشتري يقول "لا صوت"

على اتجاهه صعودا! "تعلمت Python6 أشهر، لم أتمكن من العثور على عمل!"