抛出异常:'System.IO.FileNotFoundException' in C# Windows 实例化实体数据模型对象时的服务

Exception Thrown: 'System.IO.FileNotFoundException' in C# Windows Service When Entity Data Model Object Instantiated

Windows Server 2012 R2 Standard 上的

运行 是一个 C# Windows 服务(.Net Framework 4.7。 2) 使用我写的 Entity Framework 从文件中读取数据并将数据传递给 local SQLExpress (2016) 将数据插入数据库的存储过程。

在我的 Windows 10 机器上测试它工作正常,但是在将可执行文件和 exe.config 移动到 Windows 服务器并使用正确的数据库信息更新配置之后连接字符串,事件查看器显示以下 Windows 应用程序错误:

来源:.NET 运行时事件 1026

Application: Print_Mail-DBAuger.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
   at Print_Mail_DBAuger.Program.StartParseAndInsert(System.String, System.Diagnostics.EventLog)
   at Print_Mail_DBAuger.FetchService.OnChanged(System.Object, System.IO.FileSystemEventArgs)
   at System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs)
   at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32, System.String)
   at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32, UInt32, System.Threading.NativeOverlapped*)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

这似乎阻止了调用存储过程,因此没有数据被传递到数据库。

我已将问题缩小到实体数据模型对象的实例化:

PrintMailEntities dataEntities = new PrintMailEntities();

此行调用由 Entity Framework:

创建的自动生成的代码
public partial class PrintMailEntities : DbContext
    {
        public PrintMailEntities()
            : base("name=PrintMailEntities")
        {
        }
        
        // Several more auto-generated methods...
    }

和超级 class 构造函数(同样,Entity Framework 的一部分,不是我的代码):

public class DbContext : IDisposable, IObjectContextAdapter
    {
        //
        // Summary:
        //     Constructs a new context instance using the given string as the name or connection
        //     string for the database to which a connection will be made. See the class remarks
        //     for how this is used to create a connection.
        //
        // Parameters:
        //   nameOrConnectionString:
        //     Either the database name or a connection string.
        [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
        [SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public DbContext(string nameOrConnectionString);

        // Other overrloaded constructors not used...
     }

该行之前的程序中的所有内容都按预期工作(我使用了几个应用程序事件日志来跟踪发生的事情,因为我在 Windows 服务器上没有 Visual Studio 用于调试.) 我试图读取的文件不是问题,我可以很好地读取该信息。

我也曾尝试用 try/catch 围绕实例化来捕捉 FileNotFoundException,但从未触发捕捉。我还镜像了 Windows 服务器数据库的数据库权限以匹配我本地机器数据库的数据库权限,并且 运行 都具有管理员权限。

这是 Windows 服务器中的连接字符串 exe.config:

<connectionStrings>
        <add name="PrintMailEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=machineName\HPWJA;initial catalog=PrintMail;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
    </connectionStrings>

同样,这在 Windows 10 上工作正常,连接字符串指向镜像 Windows 服务器数据库的数据库。我的机器上没有构建错误,Windows 服务器上也没有 SQL 服务器日志表明数据库端发生了任何错误。

编辑

多亏了 RB,我现在有了关于这个找不到的“文件”的更多详细信息。这是更新的事件日志。

Error: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
   at Print_Mail_DBAuger.Program.StartParseAndInsert(String inputFile, EventLog programEventLog)
   at Print_Mail_DBAuger.FetchService.OnChanged(Object sender, FileSystemEventArgs e)
EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 was missing.

错误似乎引用了 app.config

中的部分元素
<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>

服务器没有互联网,所以它可能正在尝试从网上提取 nuget 包?

问题是我缺少在构建输出的 Release 目录中找到的 EntityFramework.dll。添加 EntityFramework.dll 和 EntityFramework.SqlServer.dll 解决了这个问题。感谢 RB 帮我找到这个。