为什么在存储库中包含Repo.SaveChanges()方法?

qua*_*els 3 c# entity-framework repository-pattern

我正在与另一个开发人员讨论是否repo.SaveChanges()在我们的Entity Framework 5存储库中公开了一个方法.

我们正在考虑拥有一个可以自动保存此类更改的仓库(快速而肮脏的示例):

public class Repo {
    private OurEfContext _context = new OurEfContext();

    public void PersistCustomer(Customer cust)
    {
        // update customer code here
        _context.SaveChanges(); //  <-- is this okay?
    }
}
Run Code Online (Sandbox Code Playgroud)

我们正在考虑的另一个选择是公开一个单独的Repo.PersistChanges()方法,如下所示:

public class Repo {
    private OurEfContext _context = new OurEfContext();

    public void PersistCustomer(Customer cust)
    {
        // update customer code here
        // no call to _context.SaveChanges();
    }

    public void PersistChanges()
    {
        _context.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

我见过的大多数例子都使用第二种模式.一种模式比另一种更"正确"吗?

usr*_*usr 8

每次更改后保存都会阻止您保存批量实体.在某些图形结构中,这可能是正确性问题,在其他情况下,它只会驱动CPU负载.成本SaveChanges不仅仅是写作,还包括遍历加载到上下文中的实体.

为什么要反对实体框架?做,它想要你做什么:保存批次并SaveChanges在完成对实体的所有更改后调用.

该方法PersistCustomer错误命名:它坚持一切,而不仅仅是客户.您无法使用EF保留单个实体.您的抽象(存储库)已损坏.

人们经常将EF包装在通用存储库中,该存储库不添加任何功能但删除功能 这从来没有对我有意义.