【问题标题】:Strange behavior with Entity Framework connection strings实体框架连接字符串的奇怪行为
【发布时间】:2014-08-29 18:14:34
【问题描述】:

好吧,这很奇怪。我有一个包含两个项目的解决方案。项目 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=&quot;data source=KREUS;initial catalog=Kreus2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;data source=KREUS;initial catalog=Kreus2ECP1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;data source=KREUS;initial catalog=Kreus2ECP2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;data source=KREUS;initial catalog=Kreus2TR_12;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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=&quot;data source=KREUS;initial catalog=Kreus2;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

如您所见,连接字符串指向与我相同的服务器 (Kreus)。他想使用我的连接字符串(因为我已经设置了它们)并将它们粘贴到他的 app.config 中。

现在,当他运行时,他得到了一个错误:

上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的,用于 Database First 或 Model First 开发...

我们都使用相同的模型(项目 B 中的那个),所以我不确定为什么我的连接字符串不适合他。模型之间没有区别,我们将其用作主要项目的参考。作为 EF 的新手,我不知道在哪里寻找解决方案。我希望有人能指出我正确的方向。

编辑:为了清楚起见,我应该提到我的程序让用户从下拉列表中选择并选择他们想要与之交互的数据表。我将选择的名称传递给数据上下文的构造函数:

var dataContext = new Kreus2Context(name); // name is what the user chose for the drop-down

我的同事添加了相同的功能(下拉框和上下文构造函数,它采用字符串参数作为连接字符串名称)。

TL;DR:我的同事和我都使用相同的数据库优先 EF 模型。我的连接字符串剪切并粘贴到他的 app.config 中只是不起作用,即使我们使用的是完全相同的模型(它位于我们都在程序中引用的类库项目中)。

更新:正如下面的答案所指出的,这里问题的最终根源是我的同事将连接字符串复制到了错误的 app.config 文件中。他的解决方案中有两个项目,一个用于 GUI,一个用于业务逻辑,使用 Project B(EF 模型)。连接字符串应该已应用于 GUI 项目中的 app.config 文件,即他的执行项目。相反,它们被复制到他的业务逻辑项目中的 app.config 文件中,甚至没有被使用。

【问题讨论】:

  • 在所有情况下我都看到了这个错误,这是因为 SQL Connection 字符串被传递给了 Database-First 上下文(替代方法是 EF Connection String,正如您在问题中列出的那样)。如果不向我们展示所有他用来实例化 DbContext 的代码,就不可能真正回答这个问题。
  • @ErikPhilips 我的同事正在如上所述实例化上下文:var dataContext = new Kreus2Context... 我们都以相同的方式实例化上下文,甚至在他将我的连接字符串复制到他的 app.config 和他的连接之前字符串工作。他使用的上下文“Kreus2Context”与我的“LRIP 1,2,1a”上下文完全相同,只是名称不同。他可以使用“LRIP”名称创建上下文,但是当他尝试在 LINQ 语句中使用它时,会收到上述错误,唯一不同的是连接字符串的名称。

标签: c# connection-string entity-framework-6


【解决方案1】:

他们指向同一个项目吗?如果他们都这样做,则连接字符串必须驻留在控制可执行文件中。 (见No connection string named 'MyEntities' could be found in the application config file)。

【讨论】:

    【解决方案2】:

    模型优先或数据库优先调用模型创建以使用 .edmx 文件。 code first 生成的代码会在 on 模型创建方法中抛出上述异常,因为 code first 不使用它。

    • 扫描代码将显示此方法是否返回异常
    • 如果是这种情况,请将连接字符串更改为使用代码优先格式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2012-07-07
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多