2015-03-18 2 views
1

Я пытаюсь выполнить обновление базы данных в первой базе данных кода EF6. Все, что я сделал, это сборка моих моделей и datacontext, запуск enable-migrations и добавление-перенастройка InitialCreate. Все это хорошо работало.EF6 Code First: Login Не удалось обновить базу данных

Но база данных обновлений не работает двумя разными способами.

Некоторое время я работал, но он создавал файлы базы данных (т. Е. Файлы MDF и журналы) в каталоге c: \ Users \. Я не хочу их там. Я хочу, чтобы они были в папке App_Data на веб-сайте MVC, который я создаю (схема базы данных находится в отдельной библиотеке DLL библиотеки классов, поскольку она должна быть доступна как для приложения MVC, так и для импорта и массирования данных в консольном приложении).

Я попытался изменить расположение файлов базы данных, изменив строку подключения, но мои изменения либо игнорировались (т. Е. Файлы базы данных сохраняются в c: \ Users \), либо я столкнулся со второй ошибкой, «Невозможно открыть базу данных ... запросить логин ... бла-бла-бла». Тем не менее я мог открыть базу данных в SSMS, и моя учетная запись пользователя Windows является владельцем базы данных.

Для удовольствия я попытался удалить и создать базу данных из SSMS. Это пошло нормально ... но команда update-database >> still < < не может войти в систему.

Любая помощь в распутывании этого беспорядка будет очень признательна!

Конструктор для моего DataContext:

public CampaignDbContext() 
    : base("Council2015", throwIfV1Schema: false) 
{ 
    Database.SetInitializer<CampaignDbContext>(null); 
} 

Строка соединения в библиотеке классов app.config:

<connectionStrings> 
    <add name="Council2015" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=E:\\Programming\\Council2015\\Council2015\\App_Data\\Council2015.mdf;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

Самое недавнее исключение брошенной обновление-базы данных:

Applying explicit migrations: [201503180506326_InitialCreate]. 
Applying explicit migration: 201503180506326_InitialCreate. 
System.Data.SqlClient.SqlException (0x80131904): Cannot open database "Council2015" requested by the login. The login failed. 
Login failed for user 'KENSEI\Mark'. 
    at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) 
... 
Cannot open database "Council2015" requested by the login. The login failed. 
Login failed for user 'KENSEI\Mark'. 

Дополнительная информация:

Есть что-то, что я, очевидно, не понимаю о строках подключения. Я могу заставить базу данных обновления работать, если я дам строке подключения новое имя (например, Council2015a) и изменим соответствующий параметр конструктора в CampaignDbContext. Но он создает новую базу данных - в разделе c: \ Users \, где я не хочу этого, вместо привязки к существующему файлу базы данных.

Кроме того, если вы удалите файлы базы данных или переместите их (и обновите параметр файла прикрепления), снова произойдет тот же самый сбой входа.

Так что-то где-то запоминает ранее созданные базы данных и «отказывается» отпустить.

Все это является массово контр-интуитивно понятным (в том числе, почему база данных называется именем параметра name в строке соединения).

ответ

1

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

Используйте строку подключения, которая выглядит, как можно было бы ожидать его, чтобы посмотреть:

<add name="Council2015" connectionString="Server=(LocalDB)\v11.0; Integrated Security=true; AttachDbFileName=E:\Programming\Council2015\Council2015\App_Data\Council2015.mdf" providerName="System.Data.SqlClient"/> 

Но при запуске обновления-баз данных (после того, как делать все надстройки миграции вызовы, необходимо сделать), макияжа убедитесь, что строка соединения будет найдена командой update-database.

Звучит так, как будто это должно произойти автоматически. И это действительно так, если вы создаете свою базу данных в проекте запуска для своего решения. Потому что это то, что по умолчанию обновляет базы данных по строкам соединения.

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

При выборе библиотеки классов в качестве «проекта по умолчанию» в консоли диспетчера пакетов нет, несмотря на то, что вы (и я) могли бы подумать, информировать процесс поиска базы данных обновлений для строк подключения.

Вместо этого укажите проект запуска в явном виде:

update-database -StartUpProjectName "<class library project name, in my case>" 

и вуаля!

Теперь о том, почему не удалось найти правильную строку соединения - поскольку имя идентификатора, которое я использовал в проекте библиотеки классов, даже не отображалось в списке строк подключения в стартовом проекте моего решения, привело к ошибке «Ошибка входа в систему» ​​... ну, это вне меня :). И пример паршивого дизайна программного обеспечения, ИМХО.

0

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

+0

Я использую интегрированную защиту, так что это не ответ. –

+0

@Jagadesh Я решил проблему, вставив мой пароль вместо '*****' при копировании строки подключения – Lobato

Смежные вопросы