我使用 EntityFramework 6 进行数据库查询:
public class Entities : DbContext {
public Entities ();
public DbSet<Analysis> Analysis { get; set; }
}
public class TableController {
public function List<DataSet> GetDataSets () {
var query = "SELECT ... FROM ... WHERE ...";
var queryReturnType = typeof(Analysis);
var result = this.Entities.Database.SqlQuery(queryReturnType, query);
foreach (var elem in result) {
...
}
}
}
我在自托管WCF服务中使用了所有这些,它允许多线程:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class RestService : IRestService {
...
}
该查询适用于所有请求的90%-95%,但有时我会从我尝试迭代的 EntityFramework 中收到异常查询结果(foreach
):
打开
的基础提供程序出错在System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction [T](Func'1 func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext。&lt;&gt; c__DisplayClass65'1.b__63()
在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func'1操作)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably [TElement](String commandText,String entitySetName,ExecutionOptions executionOptions,Object [] parameters)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery [TElement](String commandText,ExecutionOptions executionOptions,Object [] parameters)
at System.Data.Entity.Internal.InternalContext。&lt;&gt; c__DisplayClass14'1.b__13()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
该服务托管在 Windows Server 2012 R2 上,当我在本地 Windows 10 计算机上执行该服务时,不会发生错误。
可能导致错误的原因是什么?
答案 0 :(得分:1)
我和EF有同样的问题。开始时,异常每天抛出一次,每天10次,最近48次/天。当然,我们无法重现这个“基础提供商在开放时失败”。我做了一切,确保我们不泄漏连接,总是使用
using (var context = new DataContext()) {
List<Billing> result = (from item in context.Billing.AsNoTracking()
select item).ToList();
return result;
}
对我们来说,解决办法就是强行打开连接。
public DataContext() : base("your connectionstring")
**this.Database.Connection.Open();**
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
希望它也适合你!
答案 1 :(得分:0)
查看连接字符串,它看起来有效。我发现这篇博文,这里的问题是他们使用的是集成安全性。如果您在IIS上运行,则IIS用户需要访问数据库。
如果您正在使用Entity Framework with Transactions,Entity Framework会自动打开和关闭每个数据库调用的连接。因此,在使用事务时,您尝试通过多个连接传播事务。这提升到了MSDTC。
(有关详细信息,请参阅此参考。)
请阅读这篇文章: MSSQL Error 'The underlying provider failed on Open'
Entity Framework The underlying provider failed on Open
Error: The underlying provider failed on Open. How to resolve it?