我正在C#asp.NET MVC2中编写一些合并功能。我也在使用Linq2SQL。
我有一个代码块,它调用两个服务,即MessageService和UserService。这些都在称为适当的存储库并对数据库进行修改。每个存储库都声明它自己的存储库实例,所以我认为这会将以下代码升级到DTC。从AccountService调用代码,这是否可以在此级别工作?并且在每个存储库的顶部声明DataContext或者我应该以某种方式传递对象是不好的做法吗?提前谢谢
//Run the merge
try
{
using (TransactionScope scope = new TransactionScope())
{
// Update Messages to be owned by primary user
if (!_MessageService.UpdateCreatedById(MergeUser.UserID, CoreUser.UserID))
{
return false;
}
// Update Comments to be owned by primary user
foreach (var curComment in _MessageService.GetUserComments(MergeUser.UserID))
{
curComment.CreatedBy = CoreUser.UserID;
}
_MessageService.Save();
// Update Logins to be owned by primary user
foreach (var CurLogin in _UserService.GetLogins(MergeUser.UserID))
{
CurLogin.UserID = CoreUser.UserID;
}
_UserService.Save();
scope.Complete();
}
return true;
}
catch (Exception ex)
{
_ErrorStack.Add(ex.Message);
ErrorService.AddError(new ErrorModel("Portal", "WidgetRepository", ErrorHelper.ErrorTypes.Critical, ex));
return false;
}
答案 0 :(得分:1)
是的,这会有效。 TransactionScope
利用分布式事务协调器,因此它能够托管超出数据库级别的事务。
DataContext生命周期的推荐做法是将其限制为工作单元。
答案 1 :(得分:1)
我的存储库中有两个构造函数,一个用于获取数据上下文,另一个用于不存在(然后将其自身实例化)。这意味着我可以根据需要使用共享数据上下文创建存储库。
我的服务类然后在其构造函数中获取存储库对象,因此我可以使用共享数据上下文的存储库来实例化多个服务(如果需要)。