我的应用程序使用两个不同的SQL 2008数据库。数据库有几个具有相同名称的表,即。 Users
。我想将EF4用于这两个数据库。但是,当我运行我的应用程序并且它命中第二个数据库的objectcontext创建时,我收到以下错误:
存在名为“用户”的多种类型 在EdmItemCollection中不同 命名空间。基于公约的映射 需要独特的名称而不考虑 到EdmItemCollection中的EdmItemCollectionto命名空间中的命名空间
这是否意味着我不能在同一个应用程序中使用两个具有(部分)相同表名的数据库?它们位于不同的名称空间,不同的edmx模型,不同的项目等。
P.S。其中一个模型是设计者生成的,使用POCO类,另一个是从数据库中推断出来的,与EF紧密耦合。
答案 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)
对于数据库优先方法,幸运的是,有两种非常简单的解决方法:
有关更多详细信息,请参阅此link
解释很清楚。