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

Сбой базы данных Entity Framework с первой базой данных обновления CREATE DATABASE

Это сообщение было отмечено

У этого есть этот

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

Я получаю это сообщение об ошибке:

Произошла ошибка активации файла. Имя физического файла '\ WRDatabase.mdf' может быть неверным. Диагностировать и корректировать дополнительные ошибки и повторить операцию. CREATE DATABASE не удалось. Некоторые файлы перечисленные имена не могут быть созданы. Проверьте связанные ошибки.

Я выполняю команду:

update-database -ConfigurationTypeName WRConfiguration  -ConnectionStringName localWR -Verbose

Обратите внимание, что в приведенной выше команде я передаю имя строки подключения, и появляется строка подключения, потому что в сообщении об ошибке появляется имя файла .mdf.

Интересно, что я могу запустить свой код, и моя база данных создана, но она создана с неправильным именем (она называется "VIN.DataModel.WRContext", которая является полным пространством имен и именем класса DbContext). Я предполагаю, что когда мой код запускает EF, не удается найти строку соединения для создания базы данных. Это преднамеренно, поскольку я буду сопоставлять этот контекст с базой данных, которая выполняется на сервере, а также с копией db, которая выполняется на локальном компьютере (т.е. У меня будет две строки соединения для одного и того же DbContext).

Вот конфигурация приложения:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>
</entityFramework>
<connectionStrings>
     <add name="localWR" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog =WRDatabase;AttachDBFilename=|DataDirectory|\WRDatabase.mdf; Integrated Security=True;MultipleActiveResultSets=True" />
</connectionStrings>

AutomaticMigrationsEnabled устанавливается в значение false в конструкторе класса Configuration.

Вот класс контекста:

public class WRContext : DbContext
{
    static WRContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<WRContext, VIN.DataModel.WRMigrations.WRConfiguration>());
    }

    public WRContext()
    {

    }

    public WRContext(string connectionString)
        : base(connectionString)
    { 

    }


    public DbSet<Emp> Emps { get; set; }
    public DbSet<Inv> Invs { get; set; }
    public DbSet<WRConfig> WRConfigs { get; set; }
}  
4b9b3361

Ответ 1

Я нашел ответ здесь:

http://kazimnami.azurewebsites.net/techblog/2012/11/24/error-a-file-activation-error-occurred-create-database-failed/

Спасибо, казим.

Исключение возникает, когда "| DataDirectory |" свойство в строке соединения не оценивается. Чтобы решить проблему, добавьте следующую строку в свой код:

AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());

Ответ 2

На самом деле вам нужно поставить строку, указанную в ответе OP в расширенном классе xxContext: dbContext.

public class WRContext : DbContext
{
    public WRContext()
        : base("localWR")
    {
        AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());
    }
    public DbSet<Emp> Emps { get; set; }
    //....
}

Ответ 3

Если предыдущий ответ правильный, его легко установить через командную строку

Update-Database -AppDomainBaseDirectory C:\you-path

Ответ 4

Для меня проблема заключалась в том, что я перешел из экземпляра (localdb) в массивный экземпляр SQL-сервера. Чтобы обновить базу данных создать необходимую базу данных я должен был удалить ;AttachDBFilename=|DataDirectory|\somedatabase.mdf

полностью, тогда все остальное работало как ожидалось

Ответ 5

Если вы выполняете тесты интеграции, используйте общий метод контроллера для установки каталога. См. Ответ StefanG.

            public static T SetupController<T>() where T : ApiController, new()
            {
                //LocalDB database to the tests directory.
                AppDomain.CurrentDomain.SetData("DataDirectory", System.IO.Directory.GetCurrentDirectory());

                var request = new HttpRequestMessage();

                var config = WebApiConfig.SetupRegister(new HttpConfiguration());

                var controller = new T()
                {
                    Request = request,
                    Configuration = config
                };

                return controller;
            }

Ответ 6

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