Сбой базы данных 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; }
}
Ответы
Ответ 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 не может создать каталог для вас по некоторым причинам.