Я пытаюсь использовать миграции на основе кода Entity Framework с моего веб-сайта. В настоящее время у меня есть решение с несколькими проектами. Существует проект Web API, который я хочу инициализировать базу данных и другой проект, называемый проектом DataLayer. Я включил миграции в проекте DataLayer и создал начальную миграцию, которая, как я надеюсь, будет использоваться для создания базы данных, если она не существует.Entity Framework MigrateDatabaseToLatestVersion дает ошибку
Вот конфигурация, которую я получил, когда я включил миграции
public sealed class Configuration : DbMigrationsConfiguration<Harris.ResidentPortal.DataLayer.ResidentPortalContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Harris.ResidentPortal.DataLayer.ResidentPortalContext context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
// context.People.AddOrUpdate(
// p => p.FullName,
// new Person { FullName = "Andrew Peters" },
// new Person { FullName = "Brice Lambson" },
// new Person { FullName = "Rowan Miller" }
// );
//
}
}
Единственное изменение, которое я сделал это после того, как она была создана в том, чтобы изменить его от внутренней общественности так WebAPI мог видеть и использовать его в это databaseinitializer. Ниже приведен код в код в Application_Start, что я использую, чтобы попытаться инициализировать базу данных
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ResidentPortalContext, Configuration>());
new ResidentPortalUnitOfWork().Context.Users.ToList();
Если я запускаю существует это или нет базы данных я получаю следующую ошибку
поиск Каталог для файла «C: \ Users \ Dave \ Documents \ Visual Studio 2012 \ Projects \ ResidentPortal \ Harris.ResidentPortal.WebApi \ App_Data \ Harris.ResidentPortal.DataLayer.ResidentPortalContext.mdf" не удалось с ошибкой операционной системы 2 (система не может найдите указанный файл.).
CREATE DATABASE не удалось. Некоторые имена файлов не могут быть созданы. Проверьте связанные ошибки.
Похоже, что он находится в совершенно неправильном месте базы данных. Кажется, что это связано с этим конкретным способом. Я инициализирую базу данных, потому что если я изменил код на следующий.
Database.SetInitializer(new DropCreateDatabaseAlways<ResidentPortalContext>());
new ResidentPortalUnitOfWork().Context.Users.ToList();
База данных будет правильно создана там, где ей нужно идти.
Я в затруднении за то, что вызывает его. Может быть, мне нужно добавить что-то еще в класс конфигурации или это связано с тем фактом, что вся моя информация о миграции находится в проекте DataLayer, но я вызываю это из проекта WebAPI?
кажется, что-то со строкой соединения, и путь вы направляете вы настроили для SQL сервер. Я бы удостоверился, что строка подключения настроена правильно, и вы можете достичь и написать все, что вам нужно. –
Мне тоже было интересно, но если я могу просто отключить одну строку MigrateDatabaseToLatestVersion и заменить ее DropCreateDatabaseAlways, и она отлично работает, тогда я думаю, что строка соединения не будет проблемой, потому что оба будут использовать ее –
OK У меня есть вычислил это, и это действительно связано с строкой соединения, но я догадываюсь, что я все еще запутался относительно того, как другая стратегия работала. Мы используем шаблон проектирования UnitOfWork, и когда вы строите UnitOfWork, он создает контекст и передает ему строку соединения, поэтому нам не нужно было в файле Web Config. Я должен был поместить строку соединения в Web.Config, чтобы заставить это работать при использовании стратегии MigrateDatabaseToLatestVersion, но theDropCrerateDatabaseAlways работал без проблем. Я использовал UnitOfWork для создания контекста перед инициализацией базы данных. Зачем?? –