2010-11-01 142 views
16

我的应用程序使用两个不同的SQL 2008数据库。数据库有几个同名的表,即。 Users。我想为这两个数据库使用EF4。然而,当我跑我的应用程序,它击中的ObjectContext创建第二个数据库,我收到以下错误:在不同的实体框架模型中不能有相同的表名称?

Multiple types with the name 'User' exist in the EdmItemCollection in different namespaces. Convention based mapping requires unique names without regard to namespace in the EdmItemCollectionto namespace in the EdmItemCollection

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

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

+0

在设计器中更改其中一个实体名称是否会解决此问题?不过,这似乎有点不方便。 – 2010-11-01 13:24:06

+0

我希望有一个不同的解决方案。这是一个数据库转换应用程序(从旧数据库到新数据库),因此有相同的表名。除了结束了错误的类型名称之外,在设计器中重命名它们意味着在新的应用程序中会进行一些严重的重构。 – Carvellis 2010-11-01 13:30:05

+0

我有不同的实体名称相同的问题... – juanora 2016-11-25 09:59:45

回答

10

错误的含义是,他说:你不能在你的场景中使用基于默认约定的映射。改为使用自定义数据库映射。 Scott Guthrie有关于this的详细博客文章。

22

要使用“默认的惯例基于映射”下面的方法2将工作:

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)) 
+0

这帮了我很多。我修改了我的T4模板以实现类似的东西,以便所有模型都可以使用配置中的一个连接字符串,但仍然只能读取其元数据。谢谢。 – 2011-05-19 12:36:21

+0

我刚刚得到upvoted,并想更新此...不要新的EntityConnection否则你需要管理打开/关闭对象。您的帮助者应该将连接字符串作为字符串返回,并在objectcontext ef4.0或dbcontext ef4.1上使用重载构造函数。 – 2012-01-06 03:45:34

+1

+ 1为更简单的解决方案,无需代码优先。 – christoph 2013-10-30 13:54:36

1

我有同样的问题,但我的解决办法是从项目中删除的MODEL \ EDMX的DLL,因为它从一个不同的项目中复制,然后重建它。 解决了一切!

相关问题