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

时间:2014-03-28 09:16:12

标签: c# entity-framework database-migration

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

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

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

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

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

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


    }




   }
}

谢谢,

19 个答案:

答案 0 :(得分:72)

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

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

答案 1 :(得分:14)

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

答案 2 :(得分:6)

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

答案 3 :(得分:3)

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

确保datacontext项目和启动项目指向同一个数据库。还可以使用问题中提到的完整命令,如下所示。你也可以包括-Force。

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

答案 4 :(得分:3)

在将现有EF核心数据上下文回滚为空时,在我删除伴随迁移的ApplicationDbContextModelSnapshot之前,我的迁移不会生成。

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

答案 5 :(得分:2)

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

在我的情况下,我正在进行迁移,我将字段添加到现有表格,最后是空UpDown方法,

我有这样的事情:

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

你能发现差异吗??

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

PS。在尝试执行任何类型的EF命令之前,请务必确保项目完全构建。如果您的项目尚未构建,则会遇到麻烦。

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

我必须使用最新的迁移更新数据库,然后再添加此参数keep together

可能它会告诉你我们尝试过的下一辆车会丢失数据。如果你负担得起,可以-TargetMigration:"{your-migration-name}"加上它。

然后我尝试添加新的-Force并且它不是空的。

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

如果在 dbContext 中添加您的类并且您的迁移仍然是空的:请执行以下操作:

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

这对我有用。

答案 11 :(得分:0)

临时删除

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}

然后进行初始创建

Add-Migration InitialCreate

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

  1. 创建您的班级,该班级将成为您的表格
    1. 您可以具有具有多对多或一对一关系的子类。
    2. 在步骤3中,您将看到两个属性都具有一对一关系的上下文。
  2. 确保您一个 DbContext
    1. 如果您有多个DbContext,则需要使用-Context参数指定要将迁移添加到的上下文。
  3. 如@CondingIntrigue所示,将您的班级添加到DbContext
    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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

对我来说,问题是应该与表ID对应的ID属性被命名为FeedbackId。 我更改为“ Id”,然后“上/下”不再为空。 邓诺(Dunno)是否可以帮上忙

答案 16 :(得分:0)

从“迁移”文件夹中删除所有内容!之后,添加迁移。

答案 17 :(得分:0)

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

我通过删除快照文件解决了这个问题,因为这会产生问题。所以我删除了所有迁移和快照文件,再次添加了迁移并运行了更新数据库。使用我的新列成功更新了表和迁移。

更好的方法是执行此操作,如果您正在处理测试数据,则运行down方法并删除表格。显然,在现实世界中放弃表格是不好的。

答案 18 :(得分:-1)

我错过了添加

{get;set}

在添加getter和setter之后,上下方法都不为空。