EF создает другую базу данных вместо применения миграции к существующей

Я не могу понять, почему создается другая база данных, когда я запускаю команду update-database вместо применения отложенных миграций к существующей базе данных. Сценарий, кажется, случается спорадически. Это крутые склоны, к которым я привык при переносе:

  1. Установите для проекта диспетчера пакетов значение MySolution.MyProject;
  2. Выполните команду update-database. Время от времени он создает новую базу данных с моим полным именем класса в контексте, например: MySolution.MyProject.MyContext;
  3. В SQL Server Management Studio я удаляю только что созданную базу данных MySolution.MyProject.MyContext;
  4. Снова выполните ту же команду update-database. Затем EF правильно находит мою базу данных с именем only MyContext и применяет только ожидающие миграции.

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

Вот мой проект миграции - файл MySolution.MyProject.MyContext, app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="MyContext" connectionString="Data Source=.\SQLDEV;Initial Catalog=MyContext;Persist Security Info=True;User ID=my_user;Password=my_password;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  ...
</configuration>

Я дал пользователю базы данных все привилегии на моем компьютере (Пользователь SQL> Роли сервера).

А вот мой файл MyContext.cs:

namespace MySolution.MyProject
{
    public class MyContext : DbContext
    {
        public MyContext()
        {
            this.Configuration.LazyLoadingEnabled = false;
        }

        public MyContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
        }

        public MyContext(DbConnection existingConnection, bool contextOwnsConnection)
            : base(existingConnection, contextOwnsConnection)
        {
        }

        public MyContext(ObjectContext objectContext, bool dbContextOwnsObjectContext)
            : base(objectContext, dbContextOwnsObjectContext)
        {
        }

        // ... lots of stuff...

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

            base.OnModelCreating(modelBuilder);
        }
    }
}

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


person rodrigogq    schedule 09.02.2015    source источник
comment
Вы можете использовать переключатель -verbose при обновлении базы данных. Я ВСЕГДА его использую, так как он дает вам представление о том, что на самом деле делает EF.   -  person DrewJordan    schedule 09.02.2015
comment
@DrewJordan Спасибо! это помогло!   -  person rodrigogq    schedule 09.02.2015
comment
Хороший! Если вы нашли свою проблему, вы должны опубликовать ее здесь в качестве ответа, чтобы помочь всем, кто может столкнуться с той же проблемой.   -  person DrewJordan    schedule 09.02.2015
comment
@DrewJordan, спасибо! ;)   -  person rodrigogq    schedule 09.02.2015


Ответы (1)


Как указал @DrewJordan, использование -verbose ясно показало мне, в чем проблема.

Поскольку я работаю с большими решениями (несколькими проектами), и каждый проект имеет свой собственный app.config (большинство из них без подключения к EF), я проверил, что отображается подробное описание:

PM> update-database -verbose
Using StartUp project 'MySolution.Business'.
Using NuGet project 'MySolution.MyProject'.

Вместо того, чтобы выбирать Default Project на MySolution.MyProject в консоли диспетчера пакетов, мне пришлось Set as StartUp Project. Затем он работал правильно, потому что он указывал на правильный app.config с моим подключением EF.

Я до сих пор не понимаю, почему второй запуск сработал нормально, но, похоже, это связано с тем фактом, что я в конечном итоге щелкнул MySolution.MyProject, и когда он станет полужирным, запускаемый проект будет правильно настроен на правильный файл app.config.

person rodrigogq    schedule 09.02.2015
comment
ах да, это было мое предположение ... на самом деле, я считаю, что мне нужно сделать и то, и другое (Set as Startup Project в обозревателе решений И установить проект по умолчанию из раскрывающегося списка в консоли диспетчера пакетов. Убедитесь, что вы выбрали этот ответ как 'принято ', поэтому он больше не отображается как "без ответа". - person DrewJordan; 09.02.2015