插件dll使用自己的实体框架



我编写了一个应用程序,它(可能不必要)在多个级别上分层。有两个独立的应用程序,一个是UI,另一个是Windows服务;两者都有在共享项目中驱动应用程序的实际代码(因此,当我更新应用程序的运行方式时,我不必同时更新UI和服务中的代码)。除了共享操作代码外,共享项目还包含基类和一个接口,该接口为其他插件模块(类项目)定义了API,这些模块可以添加、暂停、立即运行等。UI/服务所做的只是告诉每个插件运行,然后通过电子邮件发送每个插件生成的结果。

除了共享项目中的主数据模型外,我希望能够在这些插件项目中生成单独的数据模型。原因是,我不想每次为插件添加新表时都必须重新安装我的服务;通过将数据模型保留在插件中,我可以刷新插件并让服务或UI运行。我在克服"指定的命名连接在配置中找不到,不打算与EntityClient提供程序一起使用,或者无效"错误时遇到问题。我已经将插件的连接字符串从它的app.config文件复制到共享项目的app.configfile和UI的app.config.file。我甚至将.edmx文件从插件复制到了共享项目和UI项目中。然而,我仍然会犯这个错误。我想知道它是否与连接字符串(例如res://*/ATS.csdl)中引用的.csdl、ssdl和.msl文件有关。我在我有.edmx文件的所有三个项目的objDebugedmxResourcesToEmbed目录中都看到了这些文件,但尽管我知道要复制的每一条信息都在我想复制的地方,但我仍然无法用我的插件连接到数据库。有什么想法吗?

ETA:我发现,如果我从app.config文件中逐字复制连接字符串,并在创建新实体对象时指定它,它就会成功创建连接并能够查询数据库。因此,似乎某个地方的app.config没有连接字符串,但所有需要它的都有。

ETA2:我打开了符号调试,并深入研究了System.Data.EntityClient.EntityConnection失败的确切部分。它查看的是ConfigurationManager.ConnectionStrings集合,但_items成员(我希望它包含app.config文件中列出的所有连接字符串)只包含SQLEXPRESS数据库的"LocalSqlServer"条目。当然,当它尝试在我指定的名称下查找连接字符串时,它不能,因为它正在读取的任何配置文件都不包含该字符串。仍在寻找一种使其正确工作的方法。。。

我想我解决了这个问题,尽管这是一个笨拙的解决方案,我很想看看是否可以做得更优雅。然而,多亏了Kamyar的提示,以下是我最终所做的:

在符号调试过程中,我开始在EntityConnection类中搜寻,我注意到.NET没有像我认为的那样从配置文件中提取连接字符串。Kamyar建议为插件创建一个.dll.config文件,我照做了,但仍然没有成功。。。但这只是因为实体框架正在为主机可执行文件而不是插件dll寻找配置文件。因此,我将主机应用程序的app.config文件复制到我的独立插件加载的目录中,将其命名为[Application].exe.config,它会立即将其选中。

我想知道是否有更好的方法,在某个地方,我可以指定一个所有插件都应该引用的配置文件,而不是主机配置文件的副本,但我很高兴不必在代码中指定连接字符串。

最新更新