首先在EF代码中插入/更新逻辑

时间:2011-08-12 14:00:59

标签: entity-framework events entity-framework-4.1

我想为插入和更新某些EF对象的事件添加一些逻辑。 我有一个带有category对象的MVC应用程序,它有一个属性,它是name属性的一个slugified版本。

public class Category
{

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

我想仅在插入和更新事件上设置UrlName属性,因为我的slugify逻辑非常精细。

我知道我可以在上下文本身的SaveChanges()函数中添加一些逻辑,但我更愿意让代码更靠近实体本身。

有没有办法先使用EF代码完成这样的事情?

2 个答案:

答案 0 :(得分:25)

您可以使用在插入和更新之前调用的方法来设置基类

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();
    }

答案 1 :(得分:1)

没有这样的扩展点,因为您的实体是POCO - 它不知道它的持久性。必须在知道持久性的数据访问层中触发这种逻辑。 DbContext API仅提供覆盖SaveChanges

您可以在实体上公开自定义事件或方法,并在SaveChanges处理过程中调用它们。