我想知道更新服务层或存储库中的数据的正确方法是什么,并避免对服务/存储库外的对象进行更改。例如:
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中插入/更新)。
我应该禁用代理吗?或更改跟踪?或者?
答案 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可能会很昂贵。