EF迁移显示空的Up()和Down()方法

86

我有一个本地数据库,目前它已经是第二个版本了,现在应该升级到第三个版本。

之前的迁移代码是由另一个程序员生成的,所以我认为我在这里做错了什么。

在我的模型中,大约有30个类,在模型文件夹内有一个映射文件夹,其中包含了这30个类的映射。

所以现在我按照同样的方式添加了1个新类,然后在Package Manager Console中运行add-migration命令。

不幸的是,我得到了一个空的迁移Up()和Down()方法。

当我查看数据库时,可以看到__migrationHistory可用,并且有前两个迁移。如果我现在运行我的应用程序,第三个迁移也会被添加,但很明显,新表没有被创建,因为它不在Up()方法中。

我可能做错了什么?

我认为在脚手架之前的迁移过程中出了问题......就像它找不到我添加的新的Code-First类一样。

这是我的命令:

add-migration "1.2" -verbose -ProjectName "MyEFproject"

我假设脚手架不知道在哪里寻找新类...或者所有模型类都期望在项目中,这是惯例吗?
add-migration 的结果:
namespace MyProject.Migrations
{
using System;
using System.Data.Entity.Migrations;

public partial class _1002 : DbMigration
{
    public override void Up()
    {
    }

    public override void Down()
    {
    }
}
}

新模型类示例:

using System;
using System.Collections.Generic;

namespace MyProject.Models
{
public partial class MyTable
{

    public string SomeId { get; set; }
    public string SomeText { get; set; }


}
}

新的Mapping类示例

using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;

namespace MyProject.Models.Mapping
{
 public class MyTableMap : EntityTypeConfiguration<MyTable>
{

    public MyTableMap()
    {
        // Primary Key
        this.HasKey(t => t.SomeId);

        // Properties
        this.Property(t => t.SomeText)
            .IsRequired()
            .HasMaxLength(30);



        // Table & Column Mappings
        this.ToTable("MyTable", "database");
        this.Property(t => t.SomeId).HasColumnName("SomeId");
        this.Property(t => t.SomeText).HasColumnName("SomeText");


    }




   }
}

谢谢您,

5
你的 DbContext 类中是否引用了 MyTable 表? - CodingIntrigue
1
不对!我看到DBContext类藏在模型之间.... :-) 这可能是问题所在。让我试试!! - user1841243
1
重新启动 Visual Studio 帮助了我。 - Kinemota
24个回答

149

您需要将表添加到DbContext类的实现中,例如:

public class MyDatabaseEntities : DbContext {
    public virtual DbSet<MyTable> MyTable { get; set; }
}

39
在我的情况下,我已将模型添加到了DBContext中。但是,adddown仍然为空。 - Beingnin
8
我和@NithinChandran遇到了相同的问题,我通过在迁移命令中添加“-Force”解决了这个问题。 - Flipbed
4
请不要忘记使用虚拟关键字。 - Tomáš Opis
这对我很有帮助,谢谢! - Maidenless
在我的情况下,我不得不回滚迁移,删除迁移文件夹中的.cs文件,然后再次执行add-migration命令。 我使用以下命令进行回滚: Update-Database -TargetMigration $InitialDatabase -Force - undefined
显示剩余2条评论

61

在将现有的EF Core数据上下文回滚到空状态时,我的迁移无法生成,直到我删除了伴随迁移的ApplicationDbContextModelSnapshot

此类是自动生成的,需要与您当前的迁移级别对齐。


3
这解决了我的问题。我只需删除 ModelSnapshot 文件,然后重新运行 Add-Migration 命令,它就会自动生成。谢谢。 - Cristina Carrasco
2
删除 ModelSnapshot 导致新的迁移从头开始创建整个数据库,而不是从上一个应用的迁移升级模式。在执行此操作后,我不得不删除所有的迁移并重新开始。 - Neutrino
这对我解决了这个问题,谢谢。 - Martin Capodici
这背后的原因是手动删除了迁移文件,而必须使用 cmd 进行回滚。 - AbuDawood
当我使用Rider时,这个解决方案对我起到了作用。在Visual Studio中,我从未需要过这种变通方法。我认为这意味着你正在做与使用-force标志相同的事情。 - undefined

24

我能够通过删除_MigrationHistory表中的最后一次迁移记录来解决此问题。 在将新模型对象的DbSet添加到DbContext类之前,该记录已被错误地创建。 在删除后,将创建具有正确Up()和Down()方法的新迁移。


2
我之前已经创建了这些表格,因此需要进行一步操作才能使其正常工作 - 在迁移文件夹下的ProjectnameContextModelSnapshot.cs文件中删除新表 https://dev59.com/2qTja4cB1Zd3GeqPF7Ea - Chemist

13

我遇到了这个问题,因为我忘记在变量名后添加{get; set;}。


2
是的,那也是我的情况,我也会忘记。public DbSet<Value> values { get; set; } - VectorX

7

您需要将表格添加到DbContext类的实现中,例如:在将现有的EF Core数据上下文回滚为空时,我的迁移不会生成,直到我删除了伴随迁移的ApplicationDbContextModelSnapshot。


5
在我的情况下,datacontext项目是一个类库项目。它与启动项不同,启动项是asp.net mvc 5项目。现在错误地将启动项中的连接字符串指向了一个不同的数据库。
因此,请确保datacontext项目和启动项指向同一个数据库。同时,按照问题中提到的完整命令使用如下。您也可以包括-Force。
add-migration "InitialMigration" -verbose -ProjectName "MyEFproject" -Force

我必须先运行 Remove-Migration 命令,然后重新执行初始迁移和更新迁移步骤。 - Michele
3
错误提示:"Add-Migration : A parameter cannot be found that matches parameter name 'Force'". 我认为这适用于旧版本,不再起作用。 - emirhosseini
@emirhosseini,你找到如何在新版本的EF Core中强制执行的方法了吗? - DAG
我必须首先执行Remove-Migration,以便再次获取带有内容的初始迁移。这很奇怪,因为我删除了数据库并尝试通过重置数据重新开始 - 但是以前尝试的迁移数据仍然存在。 - Tore Aurstad

3

另外:确保你添加的任何新属性都是公共的!

在我的情况下,我正在进行一个迁移,其中我向现有表添加了字段,并最终得到了空的 UpDown 方法,

我的情况类似于这样:

public bool ExistingField { get; set; }
bool NewField { get;set; }

你能发现这两者的不同吗...?


如果你犯了这个错误,请使用相同的名称重新运行迁移(你可能需要添加-Force参数来完全搭建它)。

PS.在尝试进行任何类型的EF命令之前,始终确保你的项目已完全构建。如果你的项目无法构建,那么就会出现问题。


2
如果在上下文中添加了新的表格,只需在“Migration/ExampleContextModelSnapshot”中删除新表格即可。

这就是我的解决办法。我只需从开发中复制正确的快照文件,并用它替换我的文件,这样做的效果就相当于删除了我的新表(以及主分支中发生的其他更改)。 - M H

2

您需要将MyTable添加到Dbset中,这样可以解决您的问题:

public DbSet<MyTable> MyTables { get; set; }

1
我曾错误地使用一对多关系而不是多对多关系来关联两个表(即我忘记了其中一个导航属性),导致添加了空迁移。我有一个种子文件,期望一个多对多关系,但在迁移过程中失败,导致迁移失败。不幸的是,没有任何输出明显表明这是问题所在,只有通过使用Entity Framework Power Tools (v4 but installed in VS2015)才能直观地看到不正确的关系,并意识到它很可能是原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接