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

Как настроить EF6 Migrations с помощью ASP.NET Core

Я пытаюсь принять Джимми Богарда Проект ContosoUniversityCore

Я хотел бы сделать первые миграции кода, но не уверен, как правильно его настроить. Я добавил Migrator.EF6.Инструменты к моему проекту.

Когда я запускаю Enable-Migrations Я получаю эту ошибку:

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable."
At C:\Users\SomeUser\.nuget\packages\entityframework\6.1.3\tools\EntityFramework.psm1:718 char:5
+     $domain.SetData('project', $project)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SerializationException

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable."
At C:\Users\SomeUser\.nuget\packages\entityframework\6.1.3\tools\EntityFramework.psm1:719 char:5
+     $domain.SetData('contextProject', $contextProject)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SerializationException

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not 
marked as serializable."
At C:\Users\SomeUser\.nuget\packages\entityframework\6.1.3\tools\EntityFramework.psm1:720 char:5
+     $domain.SetData('startUpProject', $startUpProject)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SerializationException

System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetPropertyValue[T](Project project, String propertyName)
   at System.Data.Entity.Migrations.MigrationsDomainCommand.GetFacade(String configurationTypeName, Boolean useContextWorkingDirectory)
   at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName)
   at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Object reference not set to an instance of an object.
4b9b3361

Ответ 1

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

Вот мой рецепт использования миграции с EF 6 и .NET Core:

1st.- Вы должны добавить эти строки в .csproj:

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.1" />
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" />
</ItemGroup>

Примечание. Версия изменилась

2nd.- Создайте контекст в вашем проекте:

public class YourContext : DbContext
{
    #region Constructors

    public YourContext()
    {
    }

    public YourContext(DbContextOptions options) : base(options)
    {

    }

    #region DbSets  // YOUR DB SETS GO HERE...
    #endregion DbSets

    #region OnConfiguring // THIS HELPED ME A LOT:
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        // In order to be able to create migrations and update database:
        if (!options.IsConfigured)
        {
            options.UseSqlServer("YourLocalConnectionStringShouldBeHere");
        }
        base.OnConfiguring(options);
    }
    #endregion

    #region Model Creating

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
       // Your Model Crerating Stuff
    }

    #endregion Model Creating
}

3rd.- ДОБАВИТЬ МИГРАЦИЮ:

Перейдите в папку проекта и из cmd, введите:

dotnet ef migrations add [NameOFYourMigrationGoesHere] -c YourContext

ПРИМЕЧАНИЕ. Не забывайте добавлять созданные файлы в исходное управление, которые не выполняются автоматически.

4rd.- ОБНОВИТЬ ВАШ БД:   4.a.- В docker → Вы можете запустить проект (полностью с Docker), и миграция будет применена при первом использовании контекста.

note: (Он будет использовать сконфигурированную строку подключения для этой среды)

4.b.- Локальная БД → Изменить строку подключения, жестко закодированную в ConfigurationContext.OnConfigure и запустить (из консоли cmd):

dotnet ef database update --context ConfigurationContext

Надеюсь, это поможет вам.

Хуан

Ответ 2

ваш проект EF6 должен обеспечить реализацию IDbContextFactory. Инструменты командной строки EF6 найдут и используют эту реализацию, чтобы они могли создавать экземпляр контекста. Вот пример.

    public class SchoolContextFactory : IDbContextFactory<SchoolContext>
     {
    public SchoolContext Create()
    {
        return new EF6.SchoolContext("Server=(localdb)\\mssqllocaldb;          Database=EF6MVCCore;Trusted_Connection=True;MultipleActiveResultSets=true");
    }
   }

В файле Startup.cs основного проекта настройте контекст EF6 для инъекции зависимостей (DI) в ConfigureServices. Объекты контекста EF должны быть ограничены для жизни в течение каждого запроса.

 public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddScoped<SchoolContext>(_ => new SchoolContext(Configuration.GetConnectionString("DefaultConnection")));
}

В консоли диспетчера пакетов (PMC) для обоих проектов запустите команду Install-Package Entityframework.

В проекте библиотеки классов создайте классы модели данных и класс контекста и реализацию IDbContextFactory.

В PMC для проекта библиотеки классов запустите команды Enable-Migrations и Add-Migration Initial. Если вы создали проект ASP.NET Core как проект запуска, добавьте в эти команды -StartupProjectName EF6. в Startup.cs, зарегистрируйте контекст для DI в appsettings.json, добавьте строку подключения.

Для получения дополнительной информации посетите

https://docs.microsoft.com/en-us/aspnet/core/data/entity-framework-6

Ответ 3

Проблема заключается в том, что миграции EF 6 не привыкли работать с новым форматом csproj.

Что мне помогло этот проект.

Ознакомьтесь с инструкциями на главной странице.

В общем, вам просто нужно добавить пакет в свой проект в соответствии с инструкциями, и затем следует выполнить миграцию.