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 内插入/更新)。

我应该禁用代理吗?或更改跟踪?要不然?

4

1 回答 1

1

看起来存储库正在共享一个 DBContext。因此,调用 _db.SaveChanges();PersonRepository 将导致 DBContext 对象保存对其正在跟踪的实体所做的所有更改 - 这包括任务对象。

有多种方法可以避免这种情况,但是将 DBContext 对象包装在using语句中将确保它在执行其工作后被释放,并且不会跟踪它返回的对象。

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

请注意,这可能会影响性能,因为创建和销毁 DBContext 可能会很昂贵。

于 2012-12-06T02:47:04.280 回答