繁体   English   中英

实体框架多个结果集,Azure连接弹性和命令拦截

[英]Entity Framework Multiple Result Sets, Azure Connection Resiliency and Command Interception

我试图将连接弹性添加到我的存储库类并对其进行测试,以便将WCF服务移至Azure。 朱莉·勒曼(Julie Lerman)对此发表了精彩的文章:

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

当我调用使用常规Entity Framework查询的存储库方法时,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

我试图中继Entity Framework 6+执行策略来处理连接弹性。 但是,如果它不能处理多个结果集,那么我的下一个选择是将Polly库用于瞬态异常处理。

您是否遇到过这种情况?

您有解决方案吗?

您是否尝试过像这样从自定义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上使用了这种方法,但没有任何问题。

在这种情况下,对ExecuteReader的调用不在EF的范围内-代码直接在ADO.NET命令对象上对其进行调用。 因为您完全绕过EF来执行命令,所以您会错过所有EF(包括拦截器)。 Translate只是简单地获取已检索到的结果,然后将其填充到对象中。

由于@tdykstra提到的EF限制,我更改了存储过程以返回XML输出而不是“ Multiple Result Sets”。 我使用“ 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>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM