2011-08-12 61 views
10

我想为某些EF对象的插入和更新事件添加一些逻辑。 我有一个类别对象的MVC应用程序,它有一个属性,它是名称属性的段落版本。首先在EF代码中插入/更新逻辑

public class Category 
{ 

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

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

我知道我可以在上下文本身的SaveChanges()函数内添加一些逻辑,但我宁愿将代码放在实体本身附近。

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

回答

21

你可以设置一个有方法的基类被插入之前调用和更新

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

这是一个坏的解决方案,因为它迫使继承。更好的方法是使用Interface。 – Migol

+1

@Molol答案说明如何实现回调机制。你如何实施它取决于你。 – Eranga

+1

@Molol,他的回答很好,因为使用接口强制执行方法。 – orourkedd

1

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

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