实体框架错误:Entitycontainer名称必须是唯一的

时间:2013-07-29 20:45:43

标签: entity-framework

我已经四处寻找,但我无法找到这个特定问题的答案。实体容器名称的大多数结果都与.dll文件没有被清理或重复edmx具有相同的容器名称有关。

我有4个应用程序在3个不同的环境中访问同一个数据库,这些环境都需要自己的连接字符串。 1个控制台应用程序,1个Web应用程序和2个Web服务。为了在所有应用程序中删除edmx文件的重复,我将其拉出到自己的库中,我将其导入上述每个应用程序,并将字符串传递给构造函数,然后库使用该库来确定要使用的连接字符串。创建数据库连接。

对于网络应用和控制台应用,它运行正常。但是,2个Web服务在同一个解决方案中,我发现的是,一旦其中1个建立连接,另一个将获得实体容器名称必须是唯一的异常并失败。

基于我在论坛上能够找到的内容,似乎我需要创建一个具有不同容器名称的第二个edmx,以便两个Web服务都可以访问数据库。我想确认的是,事实上我需要做的是,这个问题没有其他解决方法。

我不喜欢为Web服务创建一个完整的edmx的想法,似乎应该有一种方法通过导入的.dll在这两个服务之间共享连接。

另外我不太明白为什么其他应用程序可以通过相同的容器名访问数据库,只有2个Web服务有此问题?

在库中,我有一个构造函数,它返回ObjectContext,如下所示:

public partial class Entity : ObjectContext
public static Entity Create(string env)
{
    switch(env)
    {...}
    return new Entity(connectionString from case statement);
}

在客户端应用程序中,我有一个名为DbConnection的类,它有一个静态方法,可以从app.configweb.config获取环境变量然后获取ObjectContext之类的所以:

public static Entity CreateDBConn()
{
    string env = WebConfigurationManager.AppSettings["env"].ToString();
    return Entity.Create(env);
}

我真的很想了解发生了什么以及为什么其他应用程序可以使用相同的容器名称,但Web服务不能使用,这也是这个特定问题的最佳“解决方案”。谢谢

2 个答案:

答案 0 :(得分:0)

这类似于我收到的嵌套web.config文件的错误消息,这些文件创建了相同名称的连接字符串 - 这听起来像是在项目设置中的情况?如果是这样,您可以使用<clear/>指令,例如:

<connectionStrings>
    <clear/>
    <!--Used to clear inherited connection strings for when this is deployed as a child application. (Avoids the name collision)-->
    <add name="DbContext" connectionString="MyString" providerName="System.Data.SqlClient" />
</connectionStrings>

答案 1 :(得分:0)

这可能适用于正常的配置文件设置,但我不使用Web.config文件作为我的连接字符串。我使用SqlConnectionStringBuilder和EntityConnectionStringBuilder来创建连接字符串。通常从web.config或app.config文件中提取的数据值保存在一个单独的xml文件中,该文件对于我创建的用于创建连接字符串的类所解析的所有应用程序是通用的。

该类的目的是创建一个可重用的连接字符串,该字符串向外部库提交ObjectContext连接请求,而不必不断地重新解析xml文件。

我将查看/ clear命令,看看它是否符合我想要做的编程方式。

为了完成这项工作,我最终创建了第二个带有不同命名空间的edmx文件来解决冲突。我想重新审视这个问题,但如果我找到更好的解决方法,我会发布。

谢谢!