如何用实体框架实现瞬态故障处理模式

时间:2015-06-26 17:35:45

标签: c# asp.net asp.net-mvc entity-framework azure-sql-database

我需要实现以下模式: https://msdn.microsoft.com/en-us/library/dn589799.aspx

我读了一本关于以下内容的书:

  

如果您使用的是Entity Framework 6(EF 6),则重试逻辑为   瞬态故障内置于框架中。当你的EF 6型号是   在您的项目中,您需要创建一个派生自的新类   DbConfiguration并自定义执行策略   构造函数。 EF 6将寻找派生自的类   项目中的DbConfiguration并使用它们来提供弹性。至   设置此项,将新的类文件添加到项目中并添加使用   System.Data.Entity和System.Data.Entity.SqlServer。

的语句

代码如下:

// Setup Spark Stream with receiver
JavaReceiverInputDStream<String> transaction = jssc.receiverStream(new TransactionStreamReceiver(StorageLevel.MEMORY_AND_DISK()));

DataFrame person1 = //load logic ommitted
DataFrame person2 = //load logic ommitted
DataFrame person3 = //load logic ommitted

// Break up Person table for faster processing
transaction.foreachRDD(new TransactionProcessingFunction(person1, sqlContext, window,1));

transaction.foreachRDD(new TransactionProcessingFunction(person2, sqlContext, window,2));

transaction.foreachRDD(new TransactionProcessingFunction(person3, sqlContext, window,2));

但是我不确定如何在我的代码上实现它:

  public class EFConfiguration : DbConfiguration
    {
        public EFConfiguration()
        {
            this.SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
        }
    }

1 个答案:

答案 0 :(得分:1)

在这里,您对弹性和重试的一致性感到困惑。

  

连接弹性是指EF能够自动重试因这些连接(网络不可用)中断而失败的任何命令。

我希望你可能不想干涉这个因为EF做得很好。从您提到的MSDN article,您似乎想要为您的实体使用缓存模式。

我可以建议您尝试实施UnitOfWork以将您的上下文CRUD操作保存在一个位置。

然后,您可以在UnitOfWork类中实现缓存,并根据操作请求的类型获取/创建/使缓存项无效。

  

确保缓存模式不能提供100%的一致性。例如。如果外部操作更改了数据库中的数据,则Cache不会知道该更改。