У меня возникает проблема при попытке запуска моего проекта каждый раз при его создании. Кажется, инициализатор работает, но когда дело доходит до первого запроса - он умирает со следующим 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" />
- Это не похоже на ошибку в моем коде/логике, так как как только запрос завершился успешно, код запустится правильно до следующего раза, когда приложение будет перестроено. Очевидно, это может быть, и, вероятно, мне придется применять работу в моем коде, несмотря ни на что.:)
Что делать?
В идеале я бы хотел "не думать о схеме базы данных". Я бы хотел, чтобы это было так, как будто в Скотт Гу отличный пост в блоге (и следить за работает с существующими базами данных), где все просто разработано и исчезло. По большей части это верно. Кажется, проблема связана с тем, что соединение не закрывается в какой-то момент, но я не могу выяснить, как исправить эту проблему.
A несколько форумов/SO сообщения подразумевают, что проблема связана с тем, что инициализаторы работают не так, как планировалось, и соединение может быть оставлено открытым. Решение в других местах, по-видимому, состоит в том, чтобы просто "не создавать свой собственный инициализатор", что не является самым большим решением, но если у кого-то нет никаких идей, мне, вероятно, придется делать это, пока CTP5 может быть.
* yep, я знаю, что это CTP, поэтому "поддерживается", вероятно, не является словом:)