免责声明/警告:我对.net很新,一年前刚刚开始使用它。
我有一个使用Entity Framework 5.0,.Net 4.6和MVC 4.0的MVC webapp,在Azure上运行。此应用程序访问两个数据库,均使用EDMX文件,并且两者都位于同一Azure服务器上。数据库的连接字符串位于web.config
as dev连接中,但Azure应用程序具有覆盖它们的环境连接字符串。
两个EDMX文件都是通过“从数据库更新模型”生成的(即,数据库首先存在,并生成edmx以匹配它)。一个EDMX文件位于同一解决方案中的第二个项目中,该项目是对我的应用程序的引用。 此EDMX文件/模型工作正常。第二个EDMX文件位于我的应用程序的“模型”部分,仅代表三个表和一些存储过程。我没有在一年内接触过这个EDMX,并且在过去的一年中它偶尔会出现间歇性问题,偶尔也无法访问数据库,但可以通过重新启动应用程序来解决。
最近,我一直在更改webapp(但仍未更改EDMX或访问该数据库模型的视图/控制器),现在应用程序无法经常访问数据库。当我重新启动或更改连接字符串时,它将再次开始工作,但在一小时左右后忘记数据库。
感觉就像webapp以某种方式丢失了与数据库的连接。连接字符串很好,模型准确等等(因为它在重新启动应用程序时有效)。
为什么一个数据库而不是另一个数据库发生这种情况?我该怎么办才能修复它?我不能每小时继续重启应用程序。
以下是我目前收到的两条错误消息:
当我尝试撤回名为[Database]的表中的记录时(EF在模型中调用了Databas)
Message: [InvalidOperationException: The entity type Databas is not part of the model for the current context.]
System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType):59
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType):13
System.Data.Entity.Internal.Linq.InternalSet`1.Initialize():0
System.Data.Entity.Internal.Linq.InternalSet`1.Include(String path):0
System.Data.Entity.Infrastructure.DbQuery`1.Include(String path):21
CVSupportPortal.Models.ViewModels.CloudAdminViewModel..ctor(Firm f):482
CVSupportPortal.Areas.CVS.Controllers.FirmsController.Cloud(Int32 firmid):206
(unknown).lambda_method(Closure , ControllerBase , Object[] ):-1
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters):129
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters):0
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41():0
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult):0
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass37+<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33():30
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult):0
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass25+<>c__DisplayClass2a.<BeginInvokeAction>b__20():23
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult):0
当我调用存储过程时:
Message: [InvalidOperationException: The type parameter 'CVSupportPortal.Models.EF.Database_Status_List_Result' in ExecuteFunction is incompatible with the type 'CloudDatabasesModel.Database_Status_List_Result' returned by the function. ]
System.Data.Common.Utils.MetadataHelper.CheckFunctionImportReturnType[TElement](EdmType expectedEdmType, MetadataWorkspace workspace):46
System.Data.Common.Utils.MetadataHelper.GetAndCheckFunctionImportReturnType[TElement](EdmFunction functionImport, Int32 resultSetIndex, MetadataWorkspace workspace):25
System.Data.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, MergeOption mergeOption, ObjectParameter[] parameters):0
CVSupportPortal.Models.EF.CloudDatabasesEntities.Database_Status_List():0
(unknown).lambda_method(Closure , ControllerBase , Object[] ):-1
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters):129
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters):0
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41():0
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult):0
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass37+<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33():30
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49():134
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult):0
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass25+<>c__DisplayClass2a.<BeginInvokeAction>b__20():23
System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult):0
答案 0 :(得分:0)
我仍然不知道问题的原因是什么,但我猜测实体框架以某种方式丢失了与数据库的连接,因为数据库可以访问其他位置,而不是通过实体框架之后已经运行了一段时间。我发现DbContext类有一个构造函数,允许您在实例化时指定连接字符串。我的解决方案是尝试使用它,希望它可以启动与数据库的新连接,而不是尝试使用旧的连接。
有效。自从我开始使用它以来,我没有任何中断。这是我更改的内容(我的数据库称为CloudDatabases)。
CloudDatabases.Context.cs
// Already present
public CloudDatabasesEntities()
: base("name=CloudDatabasesEntities")
{
}
// Added this constructor
public CloudDatabasesEntities(string connStr)
: base(connStr)
{
}
在我需要实例化与数据库的连接的类中:
// Old, normal way
var cdb = new CloudDatabaseEntitites();
// New, non-breaking way
var connStr = ConfigurationManager.ConnectionStrings["CloudDatabasesEntities"].ConnectionString.ToString();
var cdb = new CloudDatabaseEntitites(connStr);
我的Web.config(或Azure环境变量)的连接字符串定义如下:
// Web.config
<add name="CloudDatabasesEntities" connectionString="metadata=res://*/CloudDatabases.csdl|res://*/CloudDatabases.ssdl|res://*/CloudDatabases.msl;provider=System.Data.SqlClient;provider connection string="data source=████████████████████████████████;initial catalog=CloudDatabases;persist security info=True;user id=████████████;password=██████████████████████;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />