避免在存储库之外更新数据

时间:2012-12-06 02:21:25

标签: entity-framework

我想知道更新服务层或存储库中的数据的正确方法是什么,并避免对服务/存储库外的对象进行更改。例如:

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 个答案:

答案 0 :(得分: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可能会很昂贵。