我正在使用实体框架5.0
处理一个MVVM
项目。
我连接到托管数据库,有时实体框架会失去与数据库的连接。
当连接丢失时,将连接重新连接到数据库的最佳方法是什么?
当在保存更改期间连接断开时,您只会得到异常。整个保存是在由于异常而未提交的事务中完成的,EF 不会将其当前更改集标记为已完成。当发生特定异常时,只需尝试再次保存更改 - EF 将尝试打开新连接并执行相同的事务
例如:好吧,也许是这样的:
public virtual void SubmitChanges()
{
if (DataContext != null)
{
try
{
DataContext.SubmitChanges();
}
catch (Exception whenILostMyConnection)
{
SubmitChanges(); //recall the sumbitChanges
}
}
}
我会把它留在这里,以防有人像我一样正在寻找这个问题的答案。
将options => options.EnableRetryOnFailure()
添加到OnConfiguring
配置:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(
@"Server=(localdb)mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True",
options => options.EnableRetryOnFailure());
}
阅读更多此内容。
你可以在Windows Azure源代码中看到答案。Azure CRUD 操作通常会将它们放入循环中,该循环会多次重试执行相同的操作,从而导致某些特定异常。但是您必须非常小心,在大多数情况下,重试句柄会导致您的应用程序变慢。