SqlAzureExecutionStrategy öğesinin, yeniden denenecek eylemin dışında başlatılan işlemleri desteklememesi mümkündür. İşte
public AspnetUser GetAspnetUserByUserName(string userName)
{
new SuspendableSqlAzureExecutionStrategy().Execute(() =>
{
using (var tx = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
return context.AspnetUsers.Where(x => x.UserName == userName).FirstOrDefault();
}
});
}
Ama bir alternatif için kullanıyorum: Bu kısıtlama geçici olarak çözmek için size yeniden denenmek üzere, strateji askıya işlem kapsamı oluşturmak ve el yürütme stratejiye geçmesi bir eylem olarak çalışma yapmak gerekir otomatik olarak iç içe çağırmaları askıya alacaktır https://msdn.microsoft.com/en-us/data/dn307226 aşılabilecek stratejisi:
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;
using System.Data.Entity.Utilities;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Threading.Tasks;
public class SuspendableSqlAzureExecutionStrategy : IDbExecutionStrategy
{
private readonly IDbExecutionStrategy _azureExecutionStrategy;
public SuspendableSqlAzureExecutionStrategy()
{
_azureExecutionStrategy = new SqlAzureExecutionStrategy();
}
private static bool Suspend
{
get { return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; }
set { CallContext.LogicalSetData("SuspendExecutionStrategy", value); }
}
public bool RetriesOnFailure
{
get { return !Suspend; }
}
public virtual void Execute(Action operation)
{
if (!RetriesOnFailure)
{
operation();
return;
}
try
{
Suspend = true;
_azureExecutionStrategy.Execute(operation);
}
finally
{
Suspend = false;
}
}
public virtual TResult Execute<TResult>(Func<TResult> operation)
{
if (!RetriesOnFailure)
{
return operation();
}
try
{
Suspend = true;
return _azureExecutionStrategy.Execute(operation);
}
finally
{
Suspend = false;
}
}
public virtual async Task ExecuteAsync(Func<Task> operation, CancellationToken cancellationToken)
{
if (!RetriesOnFailure)
{
await operation();
return;
}
try
{
Suspend = true;
await _azureExecutionStrategy.ExecuteAsync(operation, cancellationToken);
}
finally
{
Suspend = false;
}
}
public virtual async Task<TResult> ExecuteAsync<TResult>(Func<Task<TResult>> operation, CancellationToken cancellationToken)
{
if (!RetriesOnFailure)
{
return await operation();
}
try
{
Suspend = true;
return await _azureExecutionStrategy.ExecuteAsync(operation, cancellationToken);
}
finally
{
Suspend = false;
}
}
}
public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient",() => new SuspendableSqlAzureExecutionStrategy());
}
}
Ben bunu sayesinde nasıl çalıştığını bildirmek için bu hafta, bu sınamak için çalışacağız bu yüzden yaklaşık açık değilim –
Tek şey Askıya alınması halka açık olmalıdır. Bunu şimdi de denemek, MSDN sürümünden daha temiz görünüyor. –
Sadece iyi çalışıyor. Benim tarafımda özel olmak için askıya alındı, ancak bu oldukça güzel bir uygulama, bunun için teşekkürler. –