2

我正在尝试将连接弹性添加到我的存储库类并对其进行测试,以便将我的 WCF 服务移动到 Azure。Julie Lerman 有一篇很棒的文章:

http://thedatafarm.com/data-access/testing-out-the-connection-resiliency-feature-into-ef6/#comment-61311

当我调用使用普通实体框架查询的存储库方法时,Interceptor ReaderExecuting 方法被触发,我能够模拟连接问题。

var states = dbContext.Blogs.ToList();

但是由于某种原因,当我使用从存储过程返回的“多个结果集”的存储库方法之一正在执行时,不会调用 Interceptor ReaderExecuting 方法(请参见下面的代码)。我期望在执行“ObjectContext.Translate”或“ToList”时调用 ReaderExecuting 方法,但它没有:

db.Database.Connection.Open();

var reader = cmd.ExecuteReader();

var blogs = ((IObjectContextAdapter)db).ObjectContext.Translate<Blog>(reader).ToList();

仅供参考,我正在关注这篇文章来处理“多个结果集”:

https://msdn.microsoft.com/en-us/data/jj691402.aspx

我正在尝试使用实体框架 6+ 执行策略来处理连接弹性。但是如果它不能处理多个结果集,我的下一个选择是使用 Polly 库来处理瞬态异常。

你有没有遇到过这种情况?

你有什么解决办法吗?

4

3 回答 3

0

由于@tdykstra 提到的 EF 限制,我更改了存储过程以返回 XML 输出而不是“多个结果集”。我使用“SqlQuery”方法调用存储过程并获取输出 XML,然后将 XML 反序列化为对象。这样 Interceptor ReaderExecuting 方法就被执行了,我能够测试连接弹性。希望 EF 团队在未来的版本中添加对“多个结果集”的更多支持。这是示例代码:

var paramId = new SqlParameter
{
    ParameterName = "id",
    SqlDbType = SqlDbType.Xml,
    Direction = ParameterDirection.Input,
    Value = 1
};

var paramXmlResult = new SqlParameter
{
    ParameterName = "XmlResult",
    SqlDbType = SqlDbType.Xml,
    Direction = ParameterDirection.Output
};

db.Database.SqlQuery<XElement>(
    "EXEC [dbo].[GetDataAsXml] @id, @XmlResult OUT", 
    paramId, paramXmlResult).ToList();


XElement xmlResult = XElement.Parse(paramXmlResult.Value.ToString());

//FromXElement is an Extension method that deserializes XML into a Type (like MyData)
MyData data = xmlResult.FromXElement<MyData>();
于 2015-08-14T03:14:47.450 回答
0

您是否尝试过像这样从自定义实现中连接内置连接弹性DbConfiguration

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
        : base()
    {
        var strategy = System.Data.Entity.SqlServer.SqlAzureExecutionStrategy();
        SetExecutionStrategy("System.Data.EntityClient", strategy);
        SetExecutionStrategy("System.Data.SqlClient", strategy);
    }
}

我已经将这种方法与 MARS 一起使用,并且我对此没有任何问题。

于 2015-08-10T21:55:28.917 回答
0

在这种情况下,对 ExecuteReader 的调用超出了 EF 的范围 - 代码直接在 ADO.NET 命令对象上调用它。因为您完全绕过 EF 来执行命令,所以您错过了所有 EF(包括拦截器)。Translate 只是获取已经检索到的结果并将它们填充到对象中。

于 2015-08-12T18:04:36.550 回答