2011-08-13 47 views
0

我有一個實體A,用作另一個實體B的導航屬性。我想控制實體A的插入。這就是說,只要我插入AI就必須執行其他檢查和更新其他實體。
但是,當我插入類型B的實體它會自動插入連接的A實體,而無需額外的檢查和更新我需要。防止導航屬性插入

我該如何解決這個問題?

UPDATE 我決定按照建議使用this answer。但是在OnBeforeInsert()中,我可能會添加一個新的實體到OnBeforeInsert()將不會被調用的上下文中,因爲在var changedEntities = ChangeTracker.Entries();被調用的時候新實體還不存在。
我該如何解決這個問題?

+0

檢查[這個答案](http://stackoverflow.com/questions/7041178/on-insert-update-logic-in-ef-code-first/7041363#7041363) – Eranga

+0

@Eranga:謝謝,請參閱更新。 – Naor

回答

1

EF有很少的擴展點。所以有時很難定製。

這個答案是我previous answer

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類訂閱ObjectStateManagerChanged事件ObjectStateManager的延伸。

public class MyContext : DbContext 
{ 
    public override int SaveChanges() 
    { 
     //intercept entity changes 
     UnderlyingObjectContext.ObjectStateManager.ObjectStateManagerChanged 
      += OnObjectStateManagerChanged; 

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

    ObjectContext UnderlyingObjectContext 
    { 
     get 
     { 
       return ((IObjectContextAdapter)this).ObjectContext; 
     } 
    } 

    void OnObjectStateManagerChanged(object sender, CollectionChangeEventArgs e) 
    { 
     if (e.Action == CollectionChangeAction.Add) 
     { 
      //not all added entities are new 
      if (UnderlyingObjectContext.ObjectStateManager 
       .GetObjectStateEntry(e.Element).State == EntityState.Added) 
      { 
        if (e.Element is Entity) 
        { 
         ((Entity)e.Element).OnBeforeInsert(); 
        } 
      } 
     } 
    } 
} 

如果您使用的是EF 4.0,則需要相應地對其進行自定義。

+0

不錯,但是我們不需要在全部完成後刪除OnObjectStateManagerChanged註冊嗎? – Naor

+0

@Naor是的。我正在假設一個網絡場景。 – Eranga

+0

爲什麼不需要刪除Web場景中的OnObjectStateManagerChanged註冊? – Naor