不同的实体框架模型中不能有相同的表名?

时间:2010-11-01 13:13:41

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

我的应用程序使用两个不同的SQL 2008数据库。数据库有几个具有相同名称的表,即。 Users。我想将EF4用于这两个数据库。但是,当我运行我的应用程序并且它命中第二个数据库的objectcontext创建时,我收到以下错误:

  

存在名为“用户”的多种类型   在EdmItemCollection中不同   命名空间。基于公约的映射   需要独特的名称而不考虑   到EdmItemCollection中的EdmItemCollectionto命名空间中的命名空间

这是否意味着我不能在同一个应用程序中使用两个具有(部分)相同表名的数据库?它们位于不同的名称空间,不同的edmx模型,不同的项目等。

P.S。其中一个模型是设计者生成的,使用POCO类,另一个是从数据库中推断出来的,与EF紧密耦合。

4 个答案:

答案 0 :(得分:22)

要使用“基于默认约定的映射”,以下两种方法将起作用:

1) 冲突是由使用通配符的连接字符串引起的:

    metadata=res://*/Repositories.EntityFramework.Model.csdl|res://*/Repositories.EntityFramework.Model.ssdl|res://*/Repositories.EntityFramework.Model.msl;

由于*对您的项目不起作用,您可以定义多个连接字符串以对包含edmx的程序集进行硬编码。

2)创建一个帮手

    public static EntityConnection GetEfConnectionString(this string sqlConnectionString)
    {
        var cs = string.Format(@"metadata=res://{0}/Repositories.EntityFramework.Model.csdl|res://{0}/Repositories.EntityFramework.Model.ssdl|res://{0}/Repositories.EntityFramework.Model.msl;provider=System.Data.SqlClient;provider connection string=""" + sqlConnectionString + @"""",
            Assembly.GetCallingAssembly().FullName
        );

        return new EntityConnection(cs);
    }

2017年更新:

    public static string GetEfConnectionString(this string sqlConnectionString, Type type)
    {
        string cs =
            string.Format(
                @"metadata=res://{0}/Models.Model.csdl|res://{0}/Models.Model.ssdl|res://{0}/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=""" +
                sqlConnectionString + @"""",
                type.Assembly.FullName
                );
        return cs;
    }


    // usage: don't "new" EntityConnection.  See 2012 comment.
    string connString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString.GetEfConnectionString();
    using(var entities = new XyzEntities(connString))

答案 1 :(得分:10)

错误意味着,他说:你不能在你的场景中使用默认的基于约定的映射。请改用自定义数据库映射。 Scott Guthrie有一个关于this的详细博客项目。

答案 2 :(得分:1)

我遇到了同样的问题,但我的解决方案是从项目中删除MODEL \ edmx的DLL,因为它是从不同的项目中复制的,然后重建它。 解决了一切!

答案 3 :(得分:0)

对于数据库优先方法,幸运的是,有两种非常简单的解决方法:

  1. 确保两个上下文不要共享相同的表 名称-不是最实用的方法。
  2. 通过以下方式重组解决方案 在自己的程序集中隔离数据库上下文。

有关更多详细信息,请参阅此link

解释很清楚。