如果从 pendrive 或服务器执行,实体框架会失败

Posted

技术标签:

【中文标题】如果从 pendrive 或服务器执行,实体框架会失败【英文标题】:Entity Framework fails if executed from pendrive or server 【发布时间】:2014-03-23 11:22:54 【问题描述】:

我的应用是使用 .Net 4.0 Client Profile、WPF、EF 6.0、Code-First、2 个数据提供程序(SQL Server CE 和 mysql)创建的。

如果我将调试/发布文件夹复制到本地文件路径,它可以正常工作。

但如果将此文件夹复制到 pendrive 或放入 服务器文件夹。 我第一次需要创建 DbContext 或调用数据库初始化程序时,它会失败并出现以下错误(J: 是我的 pendrive):

“System.Data.Entity.Internal.AppConfig”的类型初始化程序引发异常 为实体框架创建配置节处理程序时出错:请求失败。(J:\USERS\George\Release\app.Config 第 6 行)

System.TypeInitializationException:'System.Data.Entity.CreateDatabaseIfNotExists1' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception. ---> System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration section handler for entityFramework: Request failed. ---> System.Security.SecurityException: Request failed. at System.Void System.Data.Entity.CreateDatabaseIfNotExists1[DG.Apps.JLM.Questoes.Domain.Contexts.QuestoesContext]..ctor() 的类型初始化程序 在 j:\USERS\George\Release\Common\Common\Apps\JLM\DG.Apps.JLM.Questoes 中的 System.Void DG.Apps.JLM.Questoes.Presentation.App.OnStartup(System.Windows.StartupEventArgs e) \DG.Apps.JLM.Questoes.Presentation\App.xaml.cs:第 30 行 在对象 System.Windows.Application.<.ctor>b__1(未使用 System.Object) 在对象 System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate 回调,System.Object args,System.Int32 numArgs) 在对象 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object 源,System.Delegate 方法,System.Object args,System.Int32 numArgs,System.Delegate catchHandler) 在 System.Void System.Windows.Threading.DispatcherOperation.InvokeImpl() 在静态 System.Void System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object 状态) 在静态 System.Void System.Threading.ExecutionContext.runTryCode(System.Object userData) 在静态 System.Void System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, System.Object 状态) 在静态 System.Void System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, System.Object 状态, System.Boolean ignoreSyncCtx) 在静态 System.Void System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, System.Object 状态) 在对象 System.Windows.Threading.DispatcherOperation.Invoke() 在 System.Void System.Windows.Threading.Dispatcher.ProcessQueue() 在 IntPtr System.Windows.Threading.Dispatcher.WndProcHook(System.IntPtr hwnd,System.Int32 msg,System.IntPtr wParam,System.IntPtr lParam,System.Boolean 处理) 在 IntPtr MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd,System.Int32 msg,System.IntPtr wParam,System.IntPtr lParam,System.Boolean 处理) 在对象 MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object o) 在对象 System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate 回调,System.Object args,System.Int32 numArgs) 在对象 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object 源,System.Delegate 方法,System.Object args,System.Int32 numArgs,System.Delegate catchHandler) 在对象 System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority 优先级,System.TimeSpan 超时,System.Delegate 方法,System.Object args,System.Int32 numArgs) 在 IntPtr MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, System.Int32 msg, System.IntPtr wParam, System.IntPtr lParam) 在 System.Void System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame 框架) 在静态 System.Void System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame 框架) 在静态 System.Void System.Windows.Threading.Dispatcher.Run() 在对象 System.Windows.Application.RunDispatcher(System.Object 忽略) 在 Int32 System.Windows.Application.RunInternal(System.Windows.Window 窗口) 在 Int32 System.Windows.Application.Run(System.Windows.Window 窗口) 在 Int32 System.Windows.Application.Run() 在静态 System.Void DG.Apps.JLM.Questoes.Presentation.App.Main()

就像link中描述的一样

这是我的app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="QuestoesContextSqlServerCE" connectionString="Data Source=Questoes.sdf" providerName="System.Data.SqlServerCE.4.0" />
    <add name="QuestoesContextMySQL" connectionString="server=localhost;User Id=root;password=root;Persist Security Info=True;database=questoes" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
  </startup>
</configuration>

这是我的wpf应用OnStartup,调用SetInitializer时应用崩溃

namespace DG.Apps.JLM.Questoes.Presentation

    public partial class App : Application
    
        protected override void OnStartup(StartupEventArgs e)
        
            base.OnStartup(e);

        Database.SetInitializer(new CreateDatabaseIfNotExists<QuestoesContext>());

正如我一开始所说,如果文件夹在本地文件路径中,应用程序运行良好,只有在服务器文件夹或 pendrive 文件夹中执行时才会失败

【问题讨论】:

您对此有什么了解吗?我似乎也有同样的问题。 @PeterHansen 不,但我提供了另一种解决方案,使用 clickonce。 pendrive 或服务器具有 clickonce 应用程序文件。当用户从 pendrive 执行时,clickonce 会将文件复制到计算机中的另一个位置并从那里执行,因此不会发生错误。 【参考方案1】:

我遇到了类似的问题。我的程序是使用 WPF(针对 .NET Framework 4)、Visual Studio 2013 创建的,我的计算机上有 .NET 4.5.2。我可以完美地运行该程序,其他也有 .NET 4.5.2 的机器可以完美地运行它,但是当我把它放在另一台只有 .NET 4.0 的机器上时,我得到了你的错误描述。我想我说的是我认为这与 4.5.2 框架如何模拟 4.0 框架有关。

无论如何,我通过简单地删除应用配置的整个 entityFramework 部分来解决问题。

<entityFramework>
   <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
   <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
   </providers>
</entityFramework>

我只是从我的代码中取出了上述部分,并把其他所有内容——在应用程序配置和所有其他文件中——单独留下。

请务必留下您的

<connectionStrings>
   ...
</connectionStrings>

那里的部分。

我确实意识到您在 entityFramework 部分中的内容比我做的要多,所以我希望我的解决方案能够真正解决您的问题。

【讨论】:

嗨,这对我也有用!谢谢!但是..你知道为什么吗? 我从来没有弄清楚为什么它会修复它。对不起。 我真的很想知道这样的编辑如何解决问题。它也对我有用,但我不明白。

以上是关于如果从 pendrive 或服务器执行,实体框架会失败的主要内容,如果未能解决你的问题,请参考以下文章

实体框架:更新实体,如果不存在则添加

当执行实体框架AddOrUpdate时如何从更新中忽略一个或多个列?

实体框架查询性能

您如何在实体框架的数据库级别执行复杂的“或”过滤器?

如何在 Ubuntu 中更改 USB 记忆棒(pendrive)的权限?

使用实体框架的报告服务