connectionString по умолчанию используется в производственной базе данных .. Entity Framework

Я изучаю asp.net mvc 4 поверх структуры сущностей. Я взял на себя работу над проектом, и я пытаюсь централизовать учетные данные для подключения в зависимости от среды (dev, test, prod), в которой находится приложение.

В настоящее время у меня есть динамическая строка подключения, но по какой-то причине структура сущности игнорирует начальную настройку каталога строки подключения.

<connectionStrings>
 <add name="name1" connectionString="metadata=res://*/Model.csdl|res:  //*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=001\;Initial Catalog=**;Integrated Security=False;User ID=**;Password=**;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

<add name="name2" connectionString="metadata=res://*/Entites.csdl|res://*/Entites.ssdl|res://*/Entites.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=001\;Persist Security Info=True;User ID=**;password=**;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

I have no idea what half of the stuff in the connectionString means, but it is the second connection string giving me troubles, "name2"

Запуск отладчика показывает базовый класс, который расширяет ObjectContext, который называется так,

: base ("имя = имя2", "имя2")

Я полагал, что исходный каталог уже был установлен в строке подключения, «name1», и это будет перенесено на name2 ... но, черт возьми, я добавил исходный каталог во вторую строку подключения, и он по-прежнему по умолчанию использует неправильный каталог. Я подключаюсь к тому же серверу базы данных, но у нас есть тестовая и производственная база данных.

Что могло переопределить эту настройку каталога и перенаправить на неправильную базу данных? Когда я запускаю свой код, я получаю внутреннее исключение, сообщающее мне, что имя пользователя (имя пользователя тестовой базы данных) не имеет доступа к производственной базе данных, но я не уверен, почему производственная база данных передается.

Вот исключение:

Основной сервер testuser не может получить доступ к базе данных ProductionName в текущем контексте безопасности.]

инициализация ObjectContext

    public Entities() : base("name=name2", "name2")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

Это также есть в файлах web.config:

<entityFramework>
   <defaultConnectionFactory   type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
   <providers>
     <provider invariantName="System.Data.SqlClient"  type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
   </providers>
</entityFramework>

Я заметил еще кое-что интересное. Когда я оставляю настройку «Исходный каталог» в строке подключения «name2» и устанавливаю тестовую базу данных, и все учетные данные верны, я получаю исходную ошибку, как я написал. Если я изменю исходный каталог на производственное имя и оставлю неправильные учетные данные для входа в систему, я получаю сообщение об ошибке входа в систему. То же самое, если я изменю учетные данные и оставлю тестовую базу данных для исходного каталога. Кажется, что аутентификация проходит правильно, но что-то еще имеет значение, когда соединение проходит?


person eaglei22    schedule 22.05.2015    source источник
comment
это соединение из app.config модели данных или web.config приложения хостера?   -  person Giorgi Nakeuri    schedule 22.05.2015
comment
Это из web.config   -  person eaglei22    schedule 23.05.2015
comment
Просто мысль. Можете ли вы попробовать убрать обратную косую черту со значения data source=001\ , чтобы оно читалось как data source=001?   -  person David Tansey    schedule 23.05.2015
comment
Не могли бы вы также показать код, который вы используете для инициализации своего ObjectContext?   -  person David Tansey    schedule 23.05.2015
comment
Я пробовал, но безуспешно.   -  person eaglei22    schedule 23.05.2015
comment
@ Дэвид Тэнси, конечно. Код находится на моем компьютере на работе, и я вернусь только после праздников. Так что не забывайте обо мне :) Спасибо!   -  person eaglei22    schedule 23.05.2015
comment
@David Tansey Я добавил код конструктора.   -  person eaglei22    schedule 26.05.2015
comment
Итак, у вашего name2 установлен InitialCatalog? Потому что этого нет в опубликованном вами коде.   -  person artm    schedule 26.05.2015
comment
Нет, это только в name1 .. Я тоже пробовал вставить это в name2, но безрезультатно. Когда initialCatalog установлен в name1, оставит ли это значение по умолчанию для этого параметра каталога для любых дальнейших строк подключения?   -  person eaglei22    schedule 26.05.2015
comment
Я просто не понимаю, где могло быть перекрытие связи. Есть ли какие-либо другие факторы, которые следует учитывать помимо того, что указано в коде? Возможно, что-то связано с базой данных?   -  person eaglei22    schedule 26.05.2015


Ответы (1)


Для всех, кто сталкивается с этой проблемой. Я наконец-то понял. Другой разработчик явно ссылался на производственную базу данных во всех хранимых процедурах. Я удалил все ссылки и оставил неявный вызов, используя оператор "use", который был введен неявно во время процесса экспорта / импорта.

Пример:

ИСПОЛЬЗУЙТЕ [TestDatabase] ‹---- это выполняется в начале процедуры

Это был явный вызов производственной базы данных: FROM [productionDB]. [Dbo]. [Table] table

просто сделайте это неявным вызовом, например: FROM [dbo]. [Table] table

Если мое решение вам не подходит, я также наткнулся на эту ошибку в sql server 2008:

https://connect.microsoft.com/SQLServer/feedback/details/354291/the-server-principal-is-not-able-to-access-the-database-under-the-current-security-context-microsoft-sql-server-error-916.

person eaglei22    schedule 27.05.2015
comment
Имя БД не должно быть частью запроса. Это плохая практика. Например, имя БД можно изменить в любой момент без изменения скриптов. - person Sriwantha Attanayake; 09.03.2016