在这里,我使用事务范围存储类型为 transactionSummary 的文档,如下所示
public class TransactionSummary
{
[JsonIgnore]
public Guid? Etag { get; set; }
public String Id { get; set; }
public String TransactId { get; set; }
public OpenOrClosed BalanceType { get; set; }
public TransactStatus Status { get; set; }
public String PayeeAccountNo { get; set; }
public Decimal AmountPaid { get; set; }
}
using (var trans = new TransactionScope())
{
using (IDocumentSession sess = GetConnection())
{
sess.Store(fldtrans);
sess.SaveChanges();
}
trans.complete();
}
立即存储后,我需要检索它,所以我按以下方式进行操作
using (IDocumentSession sess = GetConnection())
{
sess.Advanced.AllowNonAuthoritativeInformation = false;
sess.Advanced.UseOptimisticConcurrency = true;
transact = sess.Query<TransactionSummary>().Where(x => x.TransactId ==transactid).FirstOrDefault();
transact.Etag = sess.Advanced.GetEtagFor(transact);
}
这里我得到一个异常如下 ex = {"Value cannot be null.\r\nParameter name: key"}StackTrace = "
at System.Collections.Generic.Dictionary 2.FindEntry(TKey key)\r\n at System.Collections.Generic.Dictionary
2.TryGetValue(TKey key, TValue& value)\r \n 在 Raven.Client.Document.InMemoryDocumentSessionOperations.GetDocumentMetadata[T](T instance) in c...
我知道提交事务需要一定的时间,因此当立即读取文档时它会失败。但是我怎样才能克服这个问题,这样我就不会牺牲我的要求。
马特在这里,我在该事务范围内也做了很多其他工作,我刚刚向您展示了一瞥,以便您了解其中之一是我将 TransactionId 发布到队列中,并且我的后台服务获取 transactionId(不是文档Id) 并执行其他一些需要在事务后完成的过程。这里发生的是队列在事务在真实数据库中受到影响之前较早地获取 transactionId。
这是我的 Getconnection 代码供参考。
public class DataAccess : IDataAccess
{
static IDocumentStore _docStore ;
public DataAccess()
{
_docStore = new DocumentStore { Url = "http://localhost:8081" };
_docStore.Initialize();
_docStore.Conventions.IdentityPartsSeparator = "-";
}
#region IDataAccess Members
public IDocumentSession GetConnection()
{
IDocumentSession sess = _docStore.OpenSession();
_docStore.DatabaseCommands.EnsureDatabaseExists("MyDB");
return sess=_docStore.OpenSession("MyDB");
}