Entity Framework Core 2.0 Add-Migration 不会创建任何迁移文件

Posted

技术标签:

【中文标题】Entity Framework Core 2.0 Add-Migration 不会创建任何迁移文件【英文标题】:Entity Framework Core 2.0 Add-Migration doesn't create any migration files 【发布时间】:2018-02-01 17:21:16 【问题描述】:

最近从 EF Core 1.0 迁移到 EF Core 2.0,运行良好。今天我添加了一个新表(代码优先)并将其添加到我的 DbContext 中:

public virtual DbSet<Foo> Foos  get; set; 

当我在一个单独的项目中使用我的 DbContext 运行迁移时(请记住这一切之前都有效),迁移结束,但没有创建迁移文件。这一切都在 Core 2.0 之前使用:

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.

没有对我来说很明显的错误,也没有创建迁移文件。我已经完成了移除迁移以开始清理,但仍然没有工作。

【问题讨论】:

为了微笑,我重命名了我的数据库并重新运行了 Add-Migrations。结果完全相同。 您找到解决方案了吗?我遇到了完全相同的问题。 【参考方案1】:

您需要更新您的 Program 类,使其看起来像这样

    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();

【讨论】:

我的网络应用程序的 Program.cs 确实已经有了这个。我的单独的类库存储库中也有一个 Program.cs。请注意,我在原始帖子中提到了一个链接,该链接是为了获得一个带有工作存储库的单独类库所遵循的步骤;这在 EF Core 2.0 和 VS 2017 15.x 之前运行良好。 @user2737646 您使用的是 .NetCore 1.x 还是 .NetCore 2.0? 我正在使用 .NetCore 2.0,VS 2017 15.3,EF Core 2.0【参考方案2】:

从迁移项目中删除所有 IDesignTimeDbContextFactory&lt;TContext&gt; 实现,并在启动类的 ConfigureServices 方法中注册 DbContext,与运行应用程序时注册的方式相同。

然后像往常一样运行你的迁移命令,这在我头疼了几个小时后对我有用。

【讨论】:

我认为这个应该可以工作......因为我正在尝试使用 sqlite 而不是 sqlserver【参考方案3】:

我尝试更新 .csproj 文件中的运行时版本以包含:

<RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>

在 PropertyGroup 标记中。它对我有用。

见:Russell Seamer's Solution

【讨论】:

【参考方案4】:

我必须将一个项目标记为启动项目。

【讨论】:

【参考方案5】:

.NET Core 类库中存在问题。成功的解决方法是将以下内容放入Model项目的csproj文件中:

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

【讨论】:

我尝试了一些方法,例如删除所有表,然后删除数据库,删除迁移等。但都没有奏效。最后,这个答案非常完美。 这个问题在 .Net 5 中修复了吗?【参考方案6】:

只需尝试查看迁移 ModelSnapshot.cs 文件,了解表名称、关系创建(在代码末尾)方面的差异。

【讨论】:

【参考方案7】:

我遇到了类似的问题,但提供的答案都没有解决它。在查看了我的.csproj-file 后,我发现 Visual Studio 在某些时候自动添加了以下几行:

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

删除此ItemGroup 后,更新我的数据库再次正常工作。

【讨论】:

【参考方案8】:

DbContext 类应该有无参数构造函数和带选项的构造函数。您必须覆盖 OnConfiguring。在其中指定了提供者,例如:

options.UseSqlServer(_connectionString);

代码示例:

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);
    

最后使用命令行并运行此命令(键入项目的文件名,您的 DbContext 文件在哪里),或者您可以使用 nuget 包管理器控制台:

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

【讨论】:

以上是关于Entity Framework Core 2.0 Add-Migration 不会创建任何迁移文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Entity Framework Core 2.0 中执行存储过程

与 Entity Framework Core 2.0 的一对零关系

Entity Framework Core 2.0:如何配置一次抽象基类

Entity Framework Core 2.0 Add-Migration 不会创建任何迁移文件

如何告诉 Entity Framework 我的 ID 列是自动递增的(AspNet Core 2.0 + PostgreSQL)?

如何防止 Entity Framework Core 2.0 重命名生成类中的表和列(数据库优先)