我目前正在使用TransactionScope来管理我的数据层中的事务,但我一直遇到嵌套事务和异步的问题,在嵌套事务期间连接似乎关闭或者事务被提升为MSDTC.我没有找到确切的问题,但在阅读之后看起来这个场景并没有得到特别好的支持,我应该使用Database.BeginTransaction()代替.
我的问题是我无法找到有关Database.BeginTransaction()如何与嵌套事务一起工作的信息,特别是在我想要使用环境事务而不是创建新事务的场景中.我怀疑它并不打算以这种方式工作,如果我想管理嵌套事务,我应该抽象出事务管理来给我更多控制权.
我不想添加不必要的抽象层,我想知道是否有人有这方面的经验,并且可以在嵌套在另一个事务中时确认Database.BeginTransaction()的行为?
有关我的DAL的其他信息:基于CQS模式,我倾向于在命令或查询处理程序中封装Db相关代码,因此这种嵌套如何发生的简化/设计示例将是:
public class AddBlogPostHandler
{
private readonly MyDbContext _myDbContext;
public AddBlogPostHandler(MyDbContext myDbContext)
{
_myDbContext = myDbContext;
}
public async Task ExecuteAsync(AddBlogPostCommand command)
{
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
// .. code to create and add a draft blog post to the context
await _myDbContext.SaveChangesAsync();
var publishBlogPostCommand = new PublishBlogPostCommand();
// ..set some variables on the PublishBlogPostCommand
await PublishBlogPostAsync(command);
scope.Complete();
}
}
}
public class PublishBlogPostHandler
{
private readonly MyDbContext _myDbContext;
public PublishBlogPostHandler(MyDbContext myDbContext) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我们需要让某些用户输入或更新的数据在添加到"实时数据"之前处于挂起状态.
在准备数据的同时,用户可以保存不完整的记录.虽然数据处于待处理状态,但我们不希望数据影响对编辑实时数据的用户施加的规则,例如,当输入已存在的相同数据时,处理实时数据的用户不应该遇到唯一的约束.待处理状态.
我设想将数据更新集合分组为"数据提交",当有人质量控制提交时,数据将被重新验证并更正/拒绝/批准.
我考虑了两种关于存储数据的方案:
1)将待处理状态数据保存在与实时数据相同的表中,但添加一个标志以指示其状态.我可以在这里看到问题,必须删除约束或使必需字段可以为空以支持"不完整"状态数据.然后是如何处理更新现有数据的问题,您必须为更新添加新行并将其链接回现有的"实时"行.这对我来说似乎有些混乱.
2)添加镜像活动表的新表并将数据存储在那里直到它被批准.这将允许我完全控制现有的活动表,而"待定"表可以被用户认为他想放在那里的任何东西滥用.这样做的缺点是我最终会在数据库中添加许多额外的表/ SP.我想到的另一个问题是用户如何在两条记录之间进行链接,其中链接的记录可能是活动表中的记录,也可能是挂起表中的记录,但我想在这种情况下你总是可以获取一份链接记录并将其视为更新?
这两种解决方案似乎都不完美,但第二种解决方案似乎对我来说是更好的选择 - 是否有第三种解决方案?
我正在使用Azure上的新网站功能,并尝试在嵌入模式下使用RavenDB运行MVC网站.一切都在本地工作正常但在azure中运行已部署的站点我收到此错误:
System.Net.NetworkInformation.NetworkInformationException:拒绝访问
当我在global.asax中创建数据库实例时会发生这种情况:
Store = EmbeddableDocumentStore { ConnectionStringName = "RavenDb" };
Run Code Online (Sandbox Code Playgroud)
我的连接字符串是:
<add name="RavenDb" connectionString="DataDir=~\App_Data\Raven" />
Run Code Online (Sandbox Code Playgroud)
谢谢!