#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 * фиксаций. Это проблема.