paultechguy
paultechguy

Reputation: 2528

Entity Framework Core 2.0 Add-Migration doesn't create any migration files

Recently migrated from EF Core 1.0 to EF Core 2.0, and it runs fine. Today I added a new table (code-first) and added it to my DbContext with:

public virtual DbSet<Foo> Foos { get; set; }

When I run a migration, with my DbContext in a separate project (remember this was all working before), the migration ends, but no migration files were created. This was all working prior to Core 2.0 using:

http://paultechguy.blogspot.com/2017/04/entity-framework-core-migrating-and.html

PM> Add-Migration GradePremade -project Mfc.MfcRepositoryModel -verbose -context MfcDbContext -StartupProject web.xyz
Using project 'class.xyz\Mfc.MfcRepositoryModel'.
Using startup project 'web.xyz'.
Build started...
Build succeeded.
C:\Program Files\dotnet\dotnet.exe exec --depsfile C:\development\xyz\web.xyz\bin\Debug\netcoreapp2.0\web.xyz.deps.json --additionalprobingpath C:\Users\pcarver\.nuget\packages --additionalprobingpath "C:\Program Files\dotnet\sdk\NuGetFallbackFolder" --runtimeconfig C:\development\xyz\web.xyz\bin\Debug\netcoreapp2.0\web.xyz.runtimeconfig.json "C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.entityframeworkcore.tools\2.0.0\tools\netcoreapp2.0\ef.dll" migrations add GradePremade --json --context MfcDbContext --verbose --no-color --prefix-output --assembly C:\development\xyz\web.xyz\bin\Debug\netcoreapp2.0\Mfc.MfcRepositoryModel.dll --startup-assembly C:\development\xyz\web.xyz\bin\Debug\netcoreapp2.0\web.xyz.dll --project-dir C:\development\xyz\class.xyz\Mfc.MfcRepositoryModel --root-namespace Mfc.MfcRepositoryModel
Using assembly 'Mfc.MfcRepositoryModel'.
Using startup assembly 'web.xyz'.
Using application base 'C:\development\xyz\web.xyz\bin\Debug\netcoreapp2.0'.
Using working directory 'C:\development\xyz\web.xyz'.
Using root namespace 'Mfc.MfcRepositoryModel'.
Using project directory 'C:\development\xyz\class.xyz\Mfc.MfcRepositoryModel'.
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider...
Finding BuildWebHost method...
No BuildWebHost method was found on type 'xyz.Program'.
No application service provider was found.
Finding DbContext classes in the project...
Found DbContext 'ApplicationDbContext'.
Found DbContext 'MfcDbContext'.
Using DbContext factory 'MfcContextFactory'.
Using context 'MfcDbContext'.
Finding design-time services for provider 'Microsoft.EntityFrameworkCore.SqlServer'...
Using design-time services from provider 'Microsoft.EntityFrameworkCore.SqlServer'.
Finding IDesignTimeServices implementations in assembly 'web.xyz'...
No design-time services were found.

No errors that seem obvious to me, and no migration files created. I've done a Remove-Migration to start clean, but still no workie.

Upvotes: 8

Views: 10211

Answers (8)

Dawid Wekwejt
Dawid Wekwejt

Reputation: 543

DbContext class should have parametrless constructor and constructor with options. You have to Override OnConfiguring. Inside of it specified provider for exaple:

options.UseSqlServer(_connectionString);

Code sample:

public class AppDbContext : DbContext
{
    private const string _connectionString = "Data Source=....;App=EntityFramework";


    public AppDbContext(DbContextOptions<AppDbContext> options)
        : base(options)
    { }

    public AppDbContext() : base()
    {
        
    }


    public virtual DbSet<MyEntitie> Users { get; set; }


    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        if (options.IsConfigured)
        {
            return;
        }

        options.UseSqlServer(_connectionString);
    }
}

At the end use command line and run this command (type file name of project where is your DbContext file), alternativly you can use nuget package manager console:

dotnet ef migrations -v -p App.csproj add Init

Upvotes: 0

Julius H&#246;rger
Julius H&#246;rger

Reputation: 382

I had a similar problem but none of the provided answers fixed it. After reviewing my .csproj-file, I found that Visual Studio automatically added the following lines at some point:

<ItemGroup>
  <Compile Remove="Migrations\**" />
  <Content Remove="Migrations\**" />
  <EmbeddedResource Remove="Migrations\**" />
  <None Remove="Migrations\**" />
</ItemGroup>

After removing this ItemGroup, updating my database worked correctly again.

Upvotes: 2

A.Peralta
A.Peralta

Reputation: 89

Just try to review the migrations ModelSnapshot.cs file, for differences in the name of a table, creations of relationships (at the end of the code).

Upvotes: 0

Nico Zhu
Nico Zhu

Reputation: 32785

There is an issue within the .NET Core class libraries. The successful workaround is to put the following in the csproj file of the Model project:

<PropertyGroup>
  <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> 
</PropertyGroup>

Upvotes: 7

Frank Horemans
Frank Horemans

Reputation: 416

I had to mark a project as the start-up project.

Upvotes: 3

stalemate
stalemate

Reputation: 77

I tried updating the runtime version in the .csproj file to include:

<RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>

in the PropertyGroup tag. It worked for me.

See: Russell Seamer's Solution

Upvotes: -3

Kornect
Kornect

Reputation: 11

Remove all your IDesignTimeDbContextFactory<TContext> implementations from your migrations project and register your DbContext in your ConfigureServices method in your startup class, the same way you would register when running the application.

Then run your migrations commands as usual, this worked for me after hours of headaches.

Upvotes: 1

user3575886
user3575886

Reputation:

You will need to update your Program class to look like this

    public class Program
{
    public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        host.Run();
    }

    // Tools will use this to get application services
    public static IWebHost BuildWebHost(string[] args) =>
        new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();
}

Upvotes: 2

Related Questions