[英]Entity Framework Multiple Result Sets, Azure Connection Resiliency and Command Interception
我试图将连接弹性添加到我的存储库类并对其进行测试,以便将WCF服务移至Azure。 朱莉·勒曼(Julie Lerman)对此发表了精彩的文章:
当我调用使用常规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.