我有一个使用“存储库和工作单元”模式设置的控制台应用程序。一切正常,当有例外时,任何事物都不会持久。否则,一切都会持久。
但是,我有一个特殊的情况,即使某些地方发生异常,我也希望我的某些过程得以持久。
例如,我有以下内容:
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只提交尚未提交的进程,或者在发生异常时放弃待处理的更改?
答案 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
}