在存储库中,最好只使用更新一个或多个寄存器的方法

本文关键字:一个 方法 寄存器 更新 存储 | 更新日期: 2023-09-27 18:16:17

我正在使用c#和EF 4.0,在我的应用程序中,我有一个连接到数据库的存储库,并执行我需要的所有操作(插入,更新,删除和逻辑,以确保信息一致)。

在某些情况下,我可能需要更新许多具有相同信息的寄存器,所以如果我有一个允许一次更新多个寄存器的方法,那就更舒服了。在这种方法中,如果寄存器有问题(唯一约束,不存在的FK…)我可以在下一个寄存器重试时分离实体。

然而,我看到了这种方法的一些问题:

1。-如何EF是一个事务,如果只有一个寄存器有问题,他们中的任何一个都被更新。

2。-如果我只更新一个寄存器,我可以分析原因是FK不存在,唯一约束等等。如果这个方法更新了很多寄存器,并且有很多寄存器有不同的问题,我就不能通知用户问题的原因,或者更难分析和通知用户。

3。-也许,所以该方法需要更多的时间,因为它使用更长的资源的服务器的CPU,所以也许其他用户不得不等待,直到一些资源被释放。这是真的,方法它是非常快,但如果我使用一个方法,只能更新一个寄存器,资源可以更好地共享更多的用户(更好的多任务?)。

优势:

1。-我只创建一个数据上下文,所以我认为这是更有效的,因为我不需要在我想要更新的每个寄存器中创建和销毁它(如果我调用N次只更新一个寄存器的方法,就会发生这种情况)。

所以我的问题是,当我需要更新许多寄存器时,更好的方法是一个接收寄存器列表作为参数并一次更新所有寄存器的方法,或者更好的方法是一次只能更新一个寄存器的方法,并且是客户端需要调用方法N次?

谢谢。

在存储库中,最好只使用更新一个或多个寄存器的方法

看一下工作单元模式。您的存储库将包含一个一次只更新一个寄存器的方法,但是您的业务逻辑将具有一个方法,该方法接受一个寄存器列表,创建一个工作实例单元,并为每个寄存器调用存储库更新方法一次。

业务逻辑看起来像:

public class MyEntityLogic
{
    ...
    public MyEntity Save(List<MyEntity> entities)
    {
        MyEntity result = null;
        using (var uow = new UnitOfWork(MyContext))
        {
            foreach (var entity in entities)
                result = MyRepository.Save(entity);
            uow.Save(); // This will actually make the changes in the DB.
        }
        return result;
    }
    ...
}

而存储库只有一个只接受一个寄存器的方法:

public class MyEntityRepository
{
    ...
    public MyEntity Save(MyEntity entity)
    {
        // Update the context if using EF or execute the query.
        ....
    }
    ...
}

当然,你应该添加异常处理。您还可以让存储库控制事务逻辑(提交、回滚、开始事务等)。无论如何,UOW不是只有一种正确的实现。

你的UnitOfWork类会处理你的"事务"。如果你有关系等等,你甚至可以对不同类型的实体使用相同的ow…

关于UOW的一些链接:

工作单位实施

http://www.codeproject.com/Articles/576681/UnderstandingplusandplusImplementingplusRepository

https://codereview.stackexchange.com/questions/5556/entity-framework-with-repository-and-unit-of-work-pattern-and-poco-architecture

玩得开心!