我有一个当前的第二个版本的本地数据库,现在应该转到它的第三个版本。
以前迁移的代码是由另一个程序员生成的,所以我假设我在这里做错了。
在我的模型中有大约30个类,在模型文件夹中有一个映射文件夹,它包含这30个类的映射。
所以现在我以与之前的类相同的方式添加了1个新类,然后在Package Manager Console中运行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");
}
}
}
谢谢,
您需要将表格添加到DbContext
类的实现中,例如
public class MyDatabaseEntities : DbContext {
public virtual DbSet<MyTable> MyTable { get; set; }
}
我想在我的数据库中添加一个额外的列后,我遇到了这个问题。因为除非表是空的,否则我的数据不会播种,我删除了所有表和迁移以重新创建表。当我尝试迁移时,迁移具有空的上下方法。
我通过删除快照文件解决了这个问题,因为这会产生问题。所以我删除了所有迁移和快照文件,再次添加了迁移并运行了更新数据库。使用我的新列成功更新了表和迁移。
但是,更好的方法是运行down方法并在执行测试数据时删除表。显然,在现实世界中删除表格是不好的。
对我来说问题是应该对应于表id的Id属性被命名为FeedbackId。我改为“Id”,然后Up / Down不再是空的。 Dunno,如果那可以帮助某种程度
我能够通过从_MigrationHistory表中删除上次迁移的记录来解决此问题。在将新模型对象的DbSet添加到DbContext类之前,此记录未正确创建。删除后,使用正确的Up()和Down()方法创建了新的迁移。
我有这个问题,因为我忘记添加{get;在我的变量名之后设置;}
在将现有EF核心数据上下文回滚为空时,在我删除伴随迁移的ApplicationDbContextModelSnapshot
之前,我的迁移不会生成。
此类是自动生成的,需要与您当前的迁移级别保持一致。
在我的例子中,datacontext项目是一个类lib项目。它与asp.net mvc 5项目的启动项目不同。现在错误地,启动项目中的连接字符串指向不同的不同数据库。
因此,请确保datacontext项目和启动项目指向同一数据库。还可以使用问题中提到的完整命令,如下所示。你也可以包括-Force。
add-migration "InitialMigration" -verbose -ProjectName "MyEFproject" -Force
在我的情况下,我正在进行迁移,其中我将字段添加到现有表格,最后是空的Up
和Down
方法,
我有这样的事情:
public bool ExistingField { get; set; }
bool NewField { get;set; }
您看得出来差别吗...?
如果您犯了这个错误,请使用相同的名称重新运行迁移(您可能需要添加-Force
参数来将其填满)。
PS。在尝试执行任何类型的EF命令之前,请务必确保项目完全构建。如果您的项目尚未构建,那么您就会遇到麻烦。
当我错误地使用1-many关系而不是多次关系(即我忘记了导航属性之一)时,我添加了空迁移。我有一个种子文件,期望有很多关系,然后在迁移期间失败导致迁移失败。不幸的是没有输出使得显而易见的是问题,只有通过使用Entity Framework Power Tools (v4 but installed in VS2015),我在视觉上看到了错误的关系,并意识到这可能是原因。
我必须使用最新的迁移更新数据库,然后添加此参数-TargetMigration:"{your-migration-name}"
。
可能它会告诉你,我们尝试过的下一辆车会丢失数据。如果你能负担得起它附加-Force
。
然后我尝试添加我的新Add-Migration
,它不是空的。
如果上面抛出异常,您可能需要做的最后一件事是去SQL Server Management Studio并删除最后一个Automatic migration
并尝试再次添加它。
从Migration文件夹中删除所有内容!之后添加迁移。