У меня проблема при попытке запустить мой проект каждый раз, когда он собирается. Кажется, инициализатор работает, но когда дело доходит до первого запроса - он умирает со следующим InvalidOperationException
.
This operation requires a connection to the 'master' database. Unable to create a
connection to the 'master' database because the original database connection has
been opened and credentials have been removed from the connection string. Supply
an unopened connection.
Для справки, я использую EF Code First CTP4, импортированный напрямую с NuGet. Подключение к SQL Server 2008 R2
Что я хочу сделать, так это заново создать базу данных, если есть какие-либо изменения модели, и заполнить ее несколькими значениями для таблицы поиска. Кажется, что обе эти вещи поддерживаются "из коробки".
Моя установка выглядит так:
Global.asax
protected void Application_Start()
{
Database.SetInitializer<CoreDB>(new CoreDBInitialiser());
// et al...
}
CoreDB.cs
public class CoreDB : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Login> Logins { get; set; }
public DbSet<Permission> Permissions { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<RolePermission> RolePermissions { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<Setting> Settings { get; set; }
}
public class CoreDBInitialiser : RecreateDatabaseIfModelChanges<CoreDB>
{
protected override void Seed(CoreDB context)
{
var settings = new List<Setting>
{
new Setting
{
SettingName = "ExampleSetting",
SettingValue = "This is a sample setting value",
}
};
settings.ForEach(d => context.Settings.Add(d));
}
}
Когда он запускается, он умирает в строке, похожей на эту, что, по сути, является первым запросом, который он встречает после создания базы данных.
User data = (from u in _data.Users where u.Username == userName select u).SingleOrDefault();
Вещи, которые я не думаю, это:
- Это не разрешения : Я удалил саму базу данных в SQL Server. Приложение воссоздает его примерно в то же время, когда пытается выполнить этот запрос (инициализатор установлен, а затем, очевидно, он задерживает создание, пока не понадобится). Я также вошел в SQL Server как пользователь, указанный в моем файле Web.config, и у них есть полный доступ на чтение / запись к базе данных. Фактически, они, вероятно, должны делать это, так как эта учетная запись также создает базы данных.
- База данных создается : при удалении базы данных она автоматически воссоздается.
- Строка подключения правильно определена , включая атрибут
providerName
.
<add name="CoreDB" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TheDatabase;User Id=TheUsername;Password=ThePassword;" providerName="System.Data.SqlClient" />
- Это не не выглядит как ошибка в моем коде / логике, так как после успешного сбоя запроса код будет запускаться правильно до следующей перестройки приложения . Это, очевидно, может быть, и, скорее всего, мне придется применить обходной код в моем коде, несмотря ни на что. :)
Что делать?
В идеале я бы хотел "не задумываться о схеме базы данных". Мне бы хотелось, чтобы это было так, как казалось в 1052 * отличном сообщении Скотта Гу (и продолжении работы с существующими базами данных ), где все просто сработало и исчезло. По большей части это правда. Похоже, проблема в том, что соединение не закрывается в какой-то момент, но я не могу выяснить, как исправить эту проблему.
A несколько форумов / SO сообщения подразумевают проблему, с которой я столкнулся, в основном потому, что инициализаторы не работают точно так, как планировалось, и соединение может быть оставлено открытым. Похоже, что решение в других местах состоит в том, чтобы просто «не создавать свой собственный инициализатор», что не является лучшим решением, но если у кого-то нет идей, возможно, мне придется делать это до CTP5.
* да, я знаю, что это CTP, так что "поддерживается", вероятно, не то слово:)