2012-12-06 61 views
0

我想知道什麼是一個服務層或倉庫內更新數據的正確方法,並避免修改服務中心/存儲庫之外的對象..例如:避免更新數據

public class PersonRepository{ 
    public class Insert(Person person){ 
      //code 
      _db.SaveChanges(); 
    } 
} 

public class TaskRepository{ 
    public class Insert(Task task){ 
      //code 
      _db.SaveChanges(); 
    } 

    public void Update(Task task){} 
} 

並在控制器中的示例代碼:

public ActionResult Insert(Task task) 
{ 
    _taskRepository.Insert(task); 

    task.Title = "foo"; 

    _personRepository.Insert(new Person()); //here the problem! 
} 

當我保存一個新的人自動實體將更新任務的稱號! 那我該如何控制它呢?我想拒絕插入/更新主存儲庫之外(在這種情況下,任務必須只在taskRepository中插入/更新)。

我應該禁用代理嗎?或更改跟蹤?要不然?

回答

1

它看起來像存儲庫共享一個DBContext。因此在PersonRepository中調用_db.SaveChanges();將導致DBContext對象保存對正在跟蹤的實體所做的所有更改 - 這包括任務對象。

有很多方法可以避免這種情況,但將DBContext對象包裝在using語句中將確保在執行其作業後將其丟棄,並且不會跟蹤它返回的對象。

public class TaskRepository 
{ 
    public class Insert(Task task) 
    { 
      using(var db = new YourContext()) 
      { 
       //code here 
       db.SaveChanges(); 
      } 
    } 
} 

請注意,這可能會影響性能,因爲創建和銷燬DBContexts可能很昂貴。

+0

謝謝,我認爲,但在我的項目中,我想使用工作單元,所以我不能這樣做。無論如何。 – MuriloKunze

+1

我明白了。你有沒有想過在SaveChanges之後調用DbContext Detach()方法,這將會阻止EF在保存後跟蹤實體。 – Judo

+0

是的:)但是有點無聊是不是? – MuriloKunze