Ответ 1
Ошибка означает, что он говорит: вы не можете использовать сопоставление по умолчанию, основанное на соглашениях, в вашем сценарии. Используйте настраиваемое сопоставление базы данных. У Скотта Гатри есть подробный пункт блога о этом.
В моем приложении используются две разные базы данных SQL 2008. Базы данных имеют несколько таблиц с тем же именем, т.е. Users
. Я бы хотел использовать EF4 для обеих этих баз данных. Тем не менее, когда я запускаю свое приложение и он попадает в создание объекта второй базы данных, я получаю следующую ошибку:
Существует несколько типов с именем "Пользователь" в EdmItemCollection в разных Пространства имен. Согласование на основе карт требует уникальных имен без учета к пространству имен в пространстве имен EdmItemCollectionto в EdmItemCollection
Означает ли это, что я не могу использовать две базы данных (частично) те же имена таблиц в одном приложении? Они находятся в разных пространствах имен, разных моделях edmx, разных проектах и т.д.
P.S. Одна из моделей генерируется разработчиками и использует классы POCO, а другая выводится из базы данных и тесно связана с EF.
Ошибка означает, что он говорит: вы не можете использовать сопоставление по умолчанию, основанное на соглашениях, в вашем сценарии. Используйте настраиваемое сопоставление базы данных. У Скотта Гатри есть подробный пункт блога о этом.
Чтобы использовать "сопоставление по умолчанию, основанное на стандартах", будут работать следующие 2 подхода:
1) Столкновение вызвано строкой соединения с использованием wild card:
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))
У меня была та же проблема, но моим решением было удалить DLL файл MODEL\edmx из проекта, потому что он был скопирован из другого проекта, а затем перестроил его. Решила все!