【问题标题】:EF migration shows empty Up() Down() methodsEF 迁移显示空的 Up() Down() 方法
【发布时间】:2014-05-07 15:50:55
【问题描述】:

我有一个本地数据库,目前处于第二版,现在应该转到第三版。

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

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

所以现在我以与之前的类相同的方式添加了 1 个新类,然后在包管理器控制台中运行 add-migration 命令。

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

当我查看数据库时,有一个 __migrationHistory 可用于前 2 次迁移。如果我现在运行我的应用程序,还会添加第三次迁移,但显然没有创建新表,因为它不在 Up() 方法中。

我做错了什么?

我认为在为之前的迁移搭建脚手架时出了点问题......就像它找不到我添加的新 Code-First 类。

这是我的命令:

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

我假设脚手架不知道在哪里寻找新类...或者按照惯例,所有模型类都应该在项目中?

添加迁移的结果:

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


}
}

新的映射类示例

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


    }




   }
}

谢谢,

【问题讨论】:

  • MyTable 是否在您的 DbContext 类中引用?
  • 不!我看到 DBContext 类隐藏在模型之间的某个地方.... :-) 这可能是问题所在。让我试试!!
  • 重新启动 Visual Studio 帮助了我

标签: c# entity-framework database-migration


【解决方案1】:

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

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

【讨论】:

  • 在我的情况下,我已在 dbcontext 中添加了模型。但adddown 仍然是空的
  • 我遇到了和@NithinChandran 一样的问题,我通过在迁移命令中添加-Force 解决了这个问题。
  • 别忘了使用虚拟关键字
  • 我遇到了问题,因为 MyTable 类和 MyTable 属性名称相同。所以我把它改成了 Mytable
  • 这对我有帮助,谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在我的例子中,datacontext 项目是一个类库项目。它与 asp.net mvc 5 项目的启动项目不同。现在错误地启动项目中的连接字符串指向不同的数据库。

    所以要保证datacontext项目和startup项目指向同一个数据库。还可以使用问题中提到的完整命令,如下所示。您也可以包含 -Force。

    add-migration "InitialMigration" -verbose -ProjectName "MyEFproject" -Force
    

    【讨论】:

    • 我必须先移除迁移,然后再重新执行初始迁移和更新迁移步骤。
    • 错误输出:“添加迁移:找不到与参数名称“强制”匹配的参数”。我假设这适用于旧版本并且不再有效。
    • @emirhosseini 您是否找到了如何强制使用较新版本的 ef core ?
    • 我必须先执行 Remove-Migration 才能再次使用内容进行初始迁移。这很奇怪,因为我删除了数据库并尝试通过重置数据重新开始 - 但迁移数据来自以前的试验仍然完好无损..
    【解决方案4】:

    我可以通过从 _MigrationHistory 表中删除上次迁移的记录来解决此问题。 在我将新模型对象的 DbSet 添加到 DbContext 类之前,此记录已被错误地创建。 删除后,使用正确的 Up() 和 Down() 方法创建了新的迁移。

    【讨论】:

    • 我之前创建了这些表,因此还需要一个步骤来完成这项工作 - 删除迁移文件夹下的 ProjectnameContextModelSnapshot.cs 文件中的新表 stackoverflow.com/questions/45915473/…
    【解决方案5】:

    另外:确保您添加的所有新属性都是公开的!

    在我的情况下,我进行了迁移,将字段添加到现有表中,并以空的 UpDown 方法结束,

    我有这样的事情:

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

    你能看出区别吗?


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

    PS。在尝试执行任何类型的 EF 命令之前,请始终确保您的项目已完全构建。如果您的项目尚未构建,您就是在自找麻烦。

    【讨论】:

      【解决方案6】:

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

      此类是自动生成的,需要与您当前的迁移级别保持一致。

      【讨论】:

      • 为我解决了这个问题。我只是删除了 ModelSnapshot 文件,当我重新运行 Add-Migration 命令时它会自动生成。谢谢
      【解决方案7】:

      在我想向我的数据库添加一个额外的列之后,我遇到了这个确切的问题。因为除非表为空,否则我的数据不会播种,因此我删除了所有表和迁移以重新创建表。当我尝试迁移时,迁移有空的 up 和 down 方法。

      我通过删除快照文件解决了这个问题,因为这是造成问题的原因。所以我删除了所有迁移和快照文件,再次添加迁移并运行更新数据库。我的新专栏已成功更新表和迁移。

      如果您正在处理测试数据,一个更好的方法是运行 down 方法并像这样删除表。显然,在现实世界中删除表是很糟糕的。

      【讨论】:

        【解决方案8】:

        在添加此参数-TargetMigration:"{your-migration-name}" 的空迁移之前,我必须使用最新迁移更新数据库。

        它可能会告诉您,我们尝试的下一个错误会导致数据丢失。如果您负担得起,请附加-Force

        然后我尝试添加我的新Add-Migration,但它不为空。

        如果上面抛出异常,您可能需要做的最后一件事是转到 SQL Server Management Studio 并删除最后一个 Automatic migration 并尝试再次添加它。

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 是的,那是我的情况,我忘记了 public DbSet values { get;放; }
          【解决方案10】:

          如果您的项目很小,即您还没有太多迁移,您可以从 Migration 文件夹中删除所有项目。之后,再次添加迁移。

          【讨论】:

          • 警告:删除迁移文件夹是一个相当危险的建议,不要这样做。
          • 这是真的!!如果您这样做,请谨慎操作。我认为它不适用于大型项目,否则您必须再次添加所有迁移。
          【解决方案11】:

          对我来说,问题是应该对应于表 id 的 Id 属性被命名为 FeedbackId。 我更改为“Id”,然后 Up/Down 不再为空。 不知道这是否能有所帮助

          【讨论】:

            【解决方案12】:

            我认为当您尝试在不更改模型的情况下进行迁移时也会发生这种情况。例如,当您执行迁移 1 并成功时,当您尝试执行迁移 2 而不对任何模型进行任何更改时,它将创建空的 UP 和 Down。

            【讨论】:

            • 这只是您的想法,还是您实际测试过?
            【解决方案13】:

            我错过了添加

            {get;set}
            

            添加getter和setter后,up和down方法不为空。

            【讨论】:

            【解决方案14】:

            从一个完整的实体框架(核心)初学者的角度来看:

            1. 创建将成为您的表的类
              1. 您可以拥有具有多对多或一对一关系的子类。
              2. 在第 3 步中,您会看到两个属性具有一对一关系的上下文。
            2. 确保您拥有一个 DbContext
              1. 如果您有多个DbContext,则需要使用-Context 参数指定要将迁移添加到哪个上下文。
            3. 将您的班级添加到您的DbContext,如@CondingIntrigue 所示
              1. 作为参考The Entity Framework Core DbSet
            public class AccountContext : DbContext
            {
                    public DbSet<Account> Accounts { get; set; }
                    public DbSet<SecretIdentity> SecretIdentity { get; set; }
            }
            
            1. 输入Add-Migration

            【讨论】:

              【解决方案15】:

              就我而言,我在使用 Visual Studio Code 时遇到了类似的问题。

              我已通过以下操作解决了这些问题:

              1. 检查您的ContextModelSnapshot : ModelSnapshot
              2. 评论模型实体定义…
              3. 删除与这些实体相关的迁移文件
              4. dbo.__EFMigrationsHistory 表中删除迁移
              5. 编译您的解决方案。
              6. 运行以下命令:
              dotnet ef migrations add migrationName -p ProjectContainer/ 
              dotnet watch run 
              

              【讨论】:

                【解决方案16】:

                如果新表添加到上下文 只需在“Migration/ExampleContextModelSnapshot”中删除新表

                【讨论】:

                  【解决方案17】:

                  临时删除

                  protected override void OnModelCreating(ModelBuilder modelBuilder)
                  {
                  }
                  

                  然后进行初始创建

                  Add-Migration InitialCreate
                  

                  【讨论】:

                    【解决方案18】:

                    如果在 dbContext 中添加类后,迁移仍然为空:请执行以下操作:

                    在您的 DbContextModelSnapshot 类中,删除您尝试对其应用添加迁移的该类名称的所有相关代码。保存 DbContextModelSnapshot.cs 并使用 Add-Migration "Added_filename"

                    这对我有用。

                    【讨论】:

                      【解决方案19】:

                      您需要在Dbset 中添加您的MyTable,您的问题将得到解决:

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

                      【讨论】:

                        【解决方案20】:

                        就我而言,我完全删除了 Migration 文件夹。只要我没有删除“ApplicationDbContextModelSnapshot”和所有以前的迁移,因为它不起作用。

                        【讨论】:

                          【解决方案21】:

                          我在 EFcore 上遇到了同样的问题。重命名 Phone -> mobile 时,迁移是空的。

                          我的 DbContext :

                              protected override void OnModelCreating(ModelBuilder modelBuilder)
                              {
                                modelBuilder.Entity<MyUser>()
                                      .Property(c => c.Mobile)
                                      .HasColumnName("phone");
                             }
                          

                          问题是使用 .HasColumnName("phone") 覆盖了实际的属性名称,因此 EF 可能看不到任何变化。 更改字符串值使其工作。

                          【讨论】:

                            【解决方案22】:

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

                            【讨论】:

                            • 这对我有用。非常感谢!
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2023-01-13
                            • 2015-07-03
                            • 2020-02-12
                            • 2012-08-29
                            • 2018-06-20
                            相关资源
                            最近更新 更多