Динамическая генерация средств доступа для свойств подкласса

#c# #properties #entity-framework-core

#c# #свойства #сущность-фреймворк-ядро

Вопрос:

я хотел бы реализовать динамический способ создания объектов для EntityFramework Core. Поэтому я создал базовый класс, который добавляет некоторую базовую функциональность сущностям. Моя цель — добиться обработки сущностей, которая может выполняться исключительно с классами сущностей.

В этом примере следует создать пользователя и задать поля, затем он должен автоматически сохранить изменения:

 new User()
{
    Email = "test123@abc.com",
    PwdHash = "some-hash"
}
  

Я уже создал базовый класс для этого, чтобы обрабатывать такие действия в фоновом режиме:

     public abstract class Entity<T> where T : Entity<T>
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        public static T Find(params object[] keyValues)
        {
            var dc = EntityManager.GetContext();

            return dc.Find<T>(keyValues);
        }

        public static List<T> Find(Expression<Func<T, bool>> _condition)
        {
            var dc = EntityManager.GetContext();

            return dc.Set<T>().Where(_condition).ToList();
        }

        public void Delete()
        {
            var dc = EntityManager.GetContext();

            dc.Set<T>().Remove((T)this);
            dc.SaveChanges();
        }

        public void Commit() 
        {
            var dc = EntityManager.GetContext();

            dc.SaveChanges();
        }
    }
  

EntityManager просто поддерживает DbContext, который работает довольно хорошо.

класс Entity тоже работает довольно хорошо, но мне нужен способ получать уведомления о том, когда свойство подкласса (T) изменяется для вызова метода «Commit ()». В настоящее время я использую установщик свойств:

     public class User : Entity<User>
    {
        [Required]
        public string Email { 
            get => _email; 
            set { _email = value; Commit(); }
        }
        private string _email = "";

        [Required]
        public string PwdHash { 
            get => _pwdHash;
            set { _pwdHash = value; Commit(); }
        }
        private string _pwdHash = "";
    }
  

Но это не то, чего я хочу. Я хотел бы просто создать автоматическое свойство, которое автоматически получает этот метод фиксации, добавляемый базовым классом. Возможно ли это в любом случае?

Комментарии:

1. Для этой цели вы должны использовать UoW и шаблон репозитория (даже мне это не нравится). В противном случае вы превратите свою модель в шаблон ActiveRecord, который неэффективен, когда вам нужно хранить несколько записей в одном пакете. Подумайте об этом.

2. На короткий срок я теперь просто вручную вызываю свой метод Commit() … Но я действительно не знаю, какая проблема может возникнуть при автоматическом вызове этого метода

3. foreach (var user in Users) { user.Email = "some"; user.PwdHash = "zzz"} N * фиксаций. Это проблема.