2011-08-12 90 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的處理過程中調用它們。