Сначала включить логику вставки/обновления в коде EF

Я хотел бы добавить некоторую логику к событиям вставки и обновления некоторых объектов EF. У меня есть приложение MVC с категориальным объектом, у которого есть свойство, которое является slugified версией свойства name.

public class Category
{

    public string Name { get; set; }
    public string UrlName{ get; set; }
}

Я хотел бы установить свойство UrlName только на событиях вставки и обновления, потому что моя логика slugify довольно сложна.

Мне известно, что я могу добавить некоторую логику внутри функции SaveChanges() в самом контексте, но я скорее хотел бы поместить код ближе к самой сущности.

Есть ли способ выполнить такую ​​вещь, используя сначала код EF?

Ответ 1

Вы можете настроить базовый класс с помощью методов, которые будут вызываться перед вставкой и обновлением

public abstract class Entity
{
    public virtual void OnBeforeInsert(){}
    public virtual void OnBeforeUpdate(){}
}

public class Category : Entity
{

    public string Name { get; set; }
    public string UrlName{ get; set; }

    public override void OnBeforeInsert()
    {
       //ur logic
    }
}

Затем в DbContext

    public override int SaveChanges()
    {
        var changedEntities = ChangeTracker.Entries();

        foreach (var changedEntity in changedEntities)
        {
            if (changedEntity.Entity is Entity)
            {
                var entity = (Entity)changedEntity.Entity;

                switch (changedEntity.State)
                {
                    case EntityState.Added:
                        entity.OnBeforeInsert();
                        break;

                    case EntityState.Modified:
                        entity.OnBeforeUpdate();
                        break;

                }
            }
        }

        return base.SaveChanges();
    }

Ответ 2

Нет такой точки расширения, потому что ваша сущность POCO - она ​​не знает о ее сохранности. Такая логика должна запускаться на уровне доступа к данным, который знает о сохранении. API DbContext предлагает только переопределение SaveChanges.

Вы можете открывать пользовательские события или методы для своих объектов и вызывать их во время обработки в SaveChanges.