EF 6存储库和工作单元模式,具有部分更新

时间:2019-03-17 19:04:02

标签: entity-framework-6 repository-pattern unit-of-work

我有一个使用“存储库和工作单元”模式设置的控制台应用程序。一切正常,当有例外时,任何事物都不会持久。否则,一切都会持久。

但是,我有一个特殊的情况,即使某些地方发生异常,我也希望我的某些过程得以持久。

例如,我有以下内容:

try
    {
        // Process 1: inserts record using repository for EntityModel1


        // Process 2: updatesrecord using repository for EntityModel2


        // Process 3: inserts record using repository for EntityModel3


        db.Commit();
    }
    catch (Exception ex)
    {
        //Log or whatever
    }

但是,当进程2发生时,即使该进程成功完成后也有异常,我还是希望将其持久化到数据库中。

在仍然使用工作单元模式的情况下如何做到这一点? 有没有一种方法可以强制某个特定进程并使db.commit只提交尚未提交的进程,或者在发生异常时放弃待处理的更改?

1 个答案:

答案 0 :(得分:0)

在您发布的示例中,所有三个过程都是单个工作单元的一部分。但是,您的问题与这个事实相矛盾。

在以下示例中,我跳过了db实例的创建和处理。如果适用,建议您将其放在using块中。

根据您的问题,您想将UoW分为三个部分(每个过程一个)。因此,如下所示是首选:

try
{
    //Start new UoW here
    db = new .....
    // Process 1: inserts record using repository for EntityModel1
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}

try
{
    //Start new UoW here
    db = new .....
    // Process 2: updatesrecord using repository for EntityModel2
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}

try
{
    //Start new UoW here
    db = new .....
    // Process 3: inserts record using repository for EntityModel3
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}

其他选择是在每个过程完成后使用Commit。但这取决于您的UoW的设计方式以及Commit方法的编码方式:

try
{
    // Process 1: inserts record using repository for EntityModel1
    db.Commit();

    // Process 2: updatesrecord using repository for EntityModel2
    db.Commit();

    // Process 3: inserts record using repository for EntityModel3
    db.Commit();
}
catch (Exception ex)
{
    //Log or whatever
}