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

我有一个本地数据库,目前在它的第二个版本,现在应该去它的第三个版本。

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

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

因此,现在我以与前面的类相同的方式添加了1个新类,然后在 Package Manager Console 中运行 add-move 命令。

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

当我查看数据库时,前两次迁移都有一个 _ _ MigationHistory 可用。如果我现在运行我的应用程序,也会添加第三个迁移,但是显然没有创建新表,因为它不在 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; }




}
}

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




}








}
}

谢谢,

60618 次浏览

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

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

当我错误地使用1-many 关系而不是 many-many 关系来关联两个表时,我正在添加空迁移(例如,我忘记了一个导航属性)。我有一个种子文件,它期望有多-多关系,但随后在迁移过程中失败,导致迁移失败。不幸的是,没有输出,使它明显的问题,它只是通过使用 实体框架电源工具(v4,但安装在 VS2015),我看到了不正确的关系,并认识到它可能是原因。

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

因此,请确保数据上下文项目和启动项目指向同一个数据库。还可以像下面这样使用问题中提到的完整命令。你也可以包括-暴力。

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

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

还有: 确保您添加的任何新属性都是公共的!

在我的例子中,我进行了一次迁移,将字段添加到一个现有的表中,最终得到的是空的 UpDown方法,

我有这样的东西:

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

你能看出区别吗?


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

附言。在尝试执行任何 EF 命令之前,始终确保您的项目构建完整。如果您的项目还没有构建,那么您就是在自找麻烦。

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

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

当我想在数据库中添加一个额外的列时,我遇到了这个问题。因为除非表是空的,否则我的数据不会产生种子,所以我删除了所有的表和迁移以重新创建表。当我尝试迁移时,迁移的上下方法都是空的。

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

不过,更好的方法是运行 down 方法,如果您正在处理测试数据,则删除这样的表。很明显,在现实世界中,这样做不好。

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

也许它会告诉你,将有数据丢失,从下一个错误的一个我们尝试。如果你能负担得起,附加 -Force到它。

然后我试着加入我的新 Add-Migration,它不是空的。

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

我有这个问题,因为我忘记在变量名后面加上{ get; set; }

如果你的项目很小,也就是说你还没有进行太多的迁移,你可以从你的迁移文件夹中删除所有的内容。然后,再次添加迁移。

对我来说,问题在于应该对应于表 Id 的 Id 属性被命名为 FeedbackId。 我改成了“ Id”然后 Up/Down 不再是空的了。 不知道这能不能帮上忙

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

我错过了加法

{get;set}

在添加 getter 和 setter 之后,up 和 down 方法不是空的。

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

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

在我的例子中,我在使用 VisualStudio 代码时遇到了类似的问题。

我通过以下方法修复了这些问题:

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

如果向上下文添加新表 只需删除“迁移/ExampleContextModelSnapshot”中的新表即可

暂时移除

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}

然后进行初始创建

Add-Migration InitialCreate

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

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

这对我有用。

你需要在 Dbset中加入你的 MyTable,你的问题就会得到解决:

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

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

我在 EFcore 上遇到过同样的问题,当重命名 Phone-> mobile 时,迁移一无所获。

我的 DbContext:

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

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

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

对我来说,这是因为我没有添加配置文件。

创建:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
}

并在从 IEntityTypeConfiguration<T>派生的相同程序集中添加配置,其中 T 是您的模型。