EF4 Code-First вызывает InvalidOperationException - PullRequest
28 голосов
/ 01 декабря 2010

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

Ответы [ 7 ]

48 голосов
/ 29 марта 2011

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

Trusted_Connection=False;Persist Security Info=True

На основании этой статьи

6 голосов
/ 21 января 2014

По запросу я публикую свой комментарий в качестве ответа.

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

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

screenshot of visual studio gui

5 голосов
/ 05 июня 2013

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

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

Проблема решена, но я неузнать подробности об этом ...

3 голосов
/ 07 декабря 2015

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

Integrated Security=True;Persist Security Info=True;
0 голосов
/ 03 мая 2016

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

0 голосов
/ 16 сентября 2012

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

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

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

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

0 голосов
/ 02 декабря 2010

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

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

Database.SetInitializer<CoreDB>(null);

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

...