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

EF4 Code-First вызывает InvalidOperationException

У меня возникает проблема при попытке запуска моего проекта каждый раз при его создании. Кажется, инициализатор работает, но когда дело доходит до первого запроса - он умирает со следующим 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, поэтому "поддерживается", вероятно, не является словом:)

4b9b3361

Ответ 1

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

Trusted_Connection=False;Persist Security Info=True

Основываясь на этой статье

Ответ 2

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

Мое решение было очень похоже на bizon, где информация Trusted_Connection и Persist Security Info нуждалась в исправлении, но я выполнил ее с помощью свойств визуальной студии, выбрав:

Проводник сервера Изменить соединение Дополнительно → Затем проверьте как Сохранять информацию о безопасности и TrustServerCertificate как True и правильно отформатировал строку подключения

screenshot of visual studio gui

Ответ 3

Просто столкнетесь с этой проблемой, в то время как я следую этому под VS2012 и EF6. Мое решение довольно просто:

В диалоговом окне "Свойства подключения", которое появляется при выборе "Обратный код инженера сначала", установите флажок "Сохранить мой пароль".

Проблема решена, но я не знаю подробностей об этом...

Ответ 4

Добавьте это в строку подключения. Это сработало для меня.

Integrated Security=True;Persist Security Info=True;

Ответ 5

Мне не удалось заставить это работать так, как я хотел. Этот ответ является препятствием/отказом, поэтому имейте в виду, когда принимаете решение о том, что делать.

Я отступил от Code-First тем временем, пока он не достиг более стабильной версии. Для тех, кто сталкивается с этой проблемой с CTP4, вы можете обойти это, потеряв ваш инициализатор и передав NULL в метод SetInitializer.

Database.SetInitializer<CoreDB>(null);

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

Ответ 6

Никогда ранее не было опубликовано, изучая Entity Framework с использованием MVC, используя 2010 и сервер базы данных dev, на котором работает SQL Server 2005 для базы данных. Я в основном парень с окнами.

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

Мое исправление было довольно жестоким, я пошел на сервер dev и зашел в мой логин, и я системный администратор на своем собственном сервере, не удивительно. Поэтому я вошел в usermapping и выбрал мастера и просто пометил каждую коробку. Теперь он работает.

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

Ответ 7

У меня был неправильный пароль. Странно сформулированное исключение.