في EF6، كيفية إنشاء طريقة عامة للحصول على الكيانات باستخدام حقل/عمود مشترك

StackOverflow https://stackoverflow.com//questions/20008329

سؤال

أنا آسف إذا لم يكن العنوان مفيدًا بدرجة كافية بعد فترة من الوقت، فلم أتمكن من تقديم عبارة لشرح مشكلتي.

انها مثل هذا:أنا أستخدم EF6، النهج الأول لقاعدة البيانات.جميع الكيانات الخاصة بي لديها معرف وخاصية ممكّنة.لدي ملف EDMX على DAL الخاص بي والآن أحتاج إلى تصميم طبقة الأعمال (BLL بالنسبة لي).

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

إذا لم يكن هذا منطقيًا، فإليك ما أفعله:(كل هذا في BLL)

public interface IEntityManager<T> where T : class {
        void Add(T e, bool commit=false);
        void Delete(T e);
        void DeleteByID(int id);
        void Update(T e);
        IQueryable<T> Search(Expression<Func<T, bool>> predicate);
        IQueryable<T> GetAll();
        T Get(int id);
    }

الآن، الفئة الأساسية التي تنفذ العمليات المشتركة هي كما يلي:(تم تحريره لسهولة القراءة والإيجاز)

 public class EntityManager<TEntity> : IDisposable, IEntityManager<TEntity> where TEntity : class {
        private readonly DbContext _ctx;
        private readonly DbSet<TEntity> _set;

        public EntityManager() {
            _ctx = new DomainModelFactory();
            _set = _ctx.Set<TEntity>();
        }

        public void Add(TEntity e) {
            _set.AddOrUpdate(e);
        }            

//other methods here

        public TEntity Get(int id) {
            return _set.Find(id);
        }


    }

لإنشاء مديرين يمكنهم الوصول فعليًا إلى البيانات وجعلها قابلة للاستخدام عبر التطبيق، أخطط للقيام بشيء مثل:

public class VenueManager: EntityManager<Venue> {
        public VenueManager():base()  {
        }
    }

للفئة التي ستدير كيان المكان الخاص بي.أقوم بإنشاء فصول بدلاً من استخدام شيء مثل

var venueManager = new EntityManager<Venue>();

لأن هذه الفئات سيكون لها بعض الأساليب المتخصصة.أتمنى أن تفهم ما قمت به حتى الآن (وهو يعمل)

مشكلتي الآن هي أن كل كيان لديه مجالين مشتركين:المعرف (int) وتمكين (Bool) أنا سأستخدمها عند الحذف حسب المعرف وعند الترميز و Getall لأنه يجب علي فقط الحصول على عناصر ممكّنة = صحيح.الآن، أعلم أنه منذ أن قمت بإنشاء فئات المدير، يمكنني فقط استخدام كود c&p، لكنني كنت أتساءل، هل هناك طريقة يمكنني من خلالها ترميز هذا في فئة EntityManager وجعل جميع المديرين يرثون الطريقة ولكن باستخدام الملموس الطبقات ؟

شيء من هذا القبيل:في فئة EntityManager:

 public TEntity Get(int id) {
            return _set.Where(T.ID==id);
        }

هذا ما أريده في الأساس:طريقة لاستخدام هذه الخصائص في الفئة الأساسية (EntityManager) حيث تكون مهمة (طرق الحذف، الحصول على، الحصول على الكل) بطريقة ترث جميع فئات المديرين (ManagerVenue في المثال) هذه الأساليب حتى لا أضطر إلى كتابتها في كل مكان وأكثر؟(حصلت على حوالي 100 كيان)

هل كانت مفيدة؟

المحلول

يجب عليك تحديد فئة أساسية أو واجهة لجميع كياناتك، مثل:

public class Entity {
    public int Id { get; set; }
    public bool Enabled { get; set; }
}

وفي الخاص بك EntityManager يضيف الفصل قيدًا عامًا إلى TEntity like where TEntity : Entity

ثم سوف تكون قادرا على استخدام الخصائص المشتركة Id و Enabled داخل الطبقة الأساسية الخاصة بك EntityManager.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top