2011-08-12 9 views
10

いくつかのEFオブジェクトの挿入イベントと更新イベントにいくつかのロジックを追加したいと思います。 私は、nameプロパティのslugifiedバージョンであるプロパティを持つcategoryオブジェクトを持つMVCアプリケーションを持っています。EFコードの挿入/更新ロジックについて最初に

public class Category 
{ 

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

私のslugifyロジックは非常に精巧であるため、挿入イベントと更新イベントに対してのみUrlNameプロパティを設定したいと考えています。

私は、コンテキスト自体に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

@Migolの答えは、コールバックメカニズムを実装する方法を示しています。それをどのように実装するかはあなた次第です。 – Eranga

+1

@ミゴール、インターフェイスを使用するとメソッドの実装が強制されるので、彼の答えは良いです。 – orourkedd

1

いいえエンティティがPOCOであるため、そのような拡張ポイントはありません。永続性を認識していません。このようなロジックは、永続性を認識しているデータアクセス層でトリガされなければならない。 DbContext APIは、SaveChangesのオーバーライドのみを提供します。

エンティティでカスタムイベントやメソッドを公開し、処理中にSaveChangesに呼び出すことができます。

関連する問題