Entity Framework数据库首先关于dll的奇怪行为

时间:2017-10-06 06:43:12

标签: c# .net sql-server entity-framework dll

我有一个远程SQL Server数据库,在dll中包含Entity Framework。 当我从主应用程序引用该dll时,我得到一个运行时异常,指出“在app.settings文件中缺少连接字符串”,或者,如果我手动添加连接字符串,则“找不到实体框架引擎”。 相反,我在我的主应用程序中从NuGet ALSO安装EF,引用的dll工作正常。

现在,我创建和引用dll的原因是为了将我的业务层与持久层分离,但是如果我需要引用EF以使我的应用程序工作,我将失去dll包装的优势

我该怎么办?

编辑: 我无法将主应用程序中的依赖项添加到EF,因为该dll的用户将是.NET之外的客户端,例如Excel或Matlab instace

2 个答案:

答案 0 :(得分:0)

dll NEVER拥有自己的配置文件,可以访问读取设置,如连接字符串。虽然您读取配置信息的代码可能在程序集中,但配置文件由主机进程拥有,因此连接字符串的条目必须出现在主机进程配置文件中。

在您的方案中,听起来像在远程服务器上,它将是充当主机进程的SQL服务器。在本地计算机上,主机进程(您的.exe或网站,IIS Wp3)将充当主机进程。您的本地进程 WILL 需要web.config / app / config中的connectionstring设置。

在VS中,当我们添加对程序集项目的引用时,所有依赖的.dll都会被编译并放在顶级应用程序bin文件夹中。如果您只是从应用程序引用.dll文件,则这些相关的.dll文件不会放在bin文件夹中。这就是您在EF中遇到的问题。

可以在.dll文件中封装EF功能,但构成EF本身的.dll文件,必须可供主机进程使用。您不需要向主应用程序添加NuGet引用。通过引用您在主应用程序中构建.dll的项目,EF引擎将被编译到主应用程序的bin文件夹中。

使用对程序集的项目引用构建和部署主应用程序后,所有必需的文件将位于执行应用程序的文件夹中。然后,您可以对.dll源进行更改,只需更新应用程序文件夹中的.dll二进制文件,前提是更改不会破坏合同等。方法签名。

答案 1 :(得分:0)

您的所有依赖项都会遇到同样的问题。您必须分发多个DLL并确保它们已加载。参见

请参阅Resolving Assembly Loads

AssemblyLoad事件允许您接管AppDomain的程序集加载过程,并且您可以在正常搜索位置之外的磁盘上找到依赖程序集(依赖于主机.exe位置),或者下载它们,或者从主.dll中的程序集资源中解压缩它们。

另见How to load an Assembly in a SSIS script task that isn’t in the GAC

相关问题