实体框架连接字符串的奇怪行为
本文关键字:框架 连接 字符串 实体 | 更新日期: 2023-09-27 18:20:04
好吧,这是一个奇怪的问题。我有一个包含两个项目的解决方案。项目A引用了项目B。项目B本质上是一个类库项目,它包含一个实体框架模型,首先创建数据库。在项目A的app.config中,我有几个连接字符串,它们指向一台服务器上的不同数据库。我的软件运行良好。以下是我的连接字符串:
<add name="LRIP 1, 2, 1A" connectionString="metadata=res://*/Kreus2Model.csdl|res://*/Kreus2Model.ssdl|res://*/Kreus2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=KREUS;initial catalog=Kreus2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="ECP 1" connectionString="metadata=res://*/Kreus2Model.csdl|res://*/Kreus2Model.ssdl|res://*/Kreus2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=KREUS;initial catalog=Kreus2ECP1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="ECP2" connectionString="metadata=res://*/Kreus2Model.csdl|res://*/Kreus2Model.ssdl|res://*/Kreus2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=KREUS;initial catalog=Kreus2ECP2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="TR-12" connectionString="metadata=res://*/Kreus2Model.csdl|res://*/Kreus2Model.ssdl|res://*/Kreus2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=KREUS;initial catalog=Kreus2TR_12;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
现在,我的同事也在研究一个使用项目B(数据模型)的解决方案。他的app.config文件中有一个连接字符串:
<add name="Kreus2Context" connectionString="metadata=res://*/Kreus2Model.csdl|res://*/Kreus2Model.ssdl|res://*/Kreus2Model.msl;provider=System.Data.SqlClient;provider connection string="data source=KREUS;initial catalog=Kreus2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
正如您所看到的,连接字符串指向与我的服务器相同的服务器(Kreus)。他想使用我的连接字符串(因为我已经设置好了),并将它们粘贴到他的app.config中。
现在,当他跑步时,他遇到了一个错误:
上下文在代码优先模式下使用,代码是从EDMX文件生成的,用于数据库优先或模型优先开发。。。
我们都使用相同的模型(项目B中的模型),所以我不确定为什么我的连接字符串不适合他。模型之间没有区别,我们将其作为主要项目的参考。作为EF的新手,我不知道在哪里寻找解决方案。我希望有人能给我指明正确的方向。
编辑:为了清楚起见,我应该提到我的程序允许用户从下拉列表中进行选择,并选择他们想要与之交互的数据表。我将选择的名称传递给datacontext的构造函数:
var dataContext = new Kreus2Context(name); // name is what the user chose for the drop-down
我的同事添加了同样的功能(下拉框和上下文的构造函数,该构造函数使用字符串parm作为连接字符串名称)。
TL;DR:我和我的同事都在使用相同的数据库优先EF模型。我剪切并粘贴到他的app.config中的连接字符串不起作用,即使我们使用的是完全相同的模型(它在我们程序中都引用的类库项目中)。
更新:正如下面的答案所指出的,这里问题的最终来源是我的同事将连接字符串复制到了错误的app.config文件中。他的解决方案中有两个项目,一个用于GUI,另一个用于业务逻辑,使用了项目B(EF模型)。连接字符串应该已经应用于GUI项目(他的执行项目)中的app.config文件。相反,它们被复制到了他的业务逻辑项目中的app.config文件中,该文件甚至没有被使用。
它们指向同一个项目吗?如果两者都这样做,则连接字符串必须驻留在控制可执行文件中。(请参阅在应用程序配置文件中找不到名为';MyEntities';的连接字符串)。
模型优先或数据库优先调用模型创建以使用.edmx文件。代码优先生成的代码将在on model创建方法中抛出上述异常,因为代码优先不使用它
- 扫描代码将显示此方法是否返回异常
- 如果是这种情况,请更改连接字符串以使用代码优先格式