Подтвердить что ты не робот

Нельзя иметь одинаковые имена таблиц в разных моделях фреймворка сущности?

В моем приложении используются две разные базы данных SQL 2008. Базы данных имеют несколько таблиц с тем же именем, т.е. Users. Я бы хотел использовать EF4 для обеих этих баз данных. Тем не менее, когда я запускаю свое приложение и он попадает в создание объекта второй базы данных, я получаю следующую ошибку:

Существует несколько типов с именем "Пользователь" в EdmItemCollection в разных Пространства имен. Согласование на основе карт требует уникальных имен без учета к пространству имен в пространстве имен EdmItemCollectionto в EdmItemCollection

Означает ли это, что я не могу использовать две базы данных (частично) те же имена таблиц в одном приложении? Они находятся в разных пространствах имен, разных моделях edmx, разных проектах и ​​т.д.

P.S. Одна из моделей генерируется разработчиками и использует классы POCO, а другая выводится из базы данных и тесно связана с EF.

4b9b3361

Ответ 1

Ошибка означает, что он говорит: вы не можете использовать сопоставление по умолчанию, основанное на соглашениях, в вашем сценарии. Используйте настраиваемое сопоставление базы данных. У Скотта Гатри есть подробный пункт блога о этом.

Ответ 2

Чтобы использовать "сопоставление по умолчанию, основанное на стандартах", будут работать следующие 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))

Ответ 3

У меня была та же проблема, но моим решением было удалить DLL файл MODEL\edmx из проекта, потому что он был скопирован из другого проекта, а затем перестроил его. Решила все!