Сначала вставьте / обновите логику в коде EF - PullRequest
14 голосов
/ 12 августа 2011

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

public class Category
{

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

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

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

Есть ли способ сделать это с помощью кода EF?

Ответы [ 2 ]

26 голосов
/ 12 августа 2011

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

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 голосов
/ 12 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...