EF迁移显示空Up() Down()方法
本文关键字:方法 Down Up 迁移 显示 EF | 更新日期: 2023-09-27 17:54:17
我有一个本地数据库,目前在它的第二个版本,现在应该去它的第三个版本。
以前的迁移代码是由另一个程序员生成的,所以我假设我在这里做错了什么。
在我的模型中有大约30个类,在模型文件夹中有一个映射文件夹,它包含了这30个类的映射。
所以现在我以与之前的类相同的方式添加了一个新类,然后在包管理器控制台运行add-migration命令。
不幸的是,我得到一个空的迁移Up()和Down()方法。
当我在数据库中查看时,有一个__migrationHistory与前2个迁移可用。如果我现在运行我的应用程序,第三次迁移也被添加,但显然没有创建新表,因为它不在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");
}
}
}
谢谢,
您需要将您的表添加到您的DbContext
类的实现中,例如
public class MyDatabaseEntities : DbContext {
public virtual DbSet<MyTable> MyTable { get; set; }
}
当将现有的EF Core Data Context回滚为空时,我的迁移将不会生成,直到我删除伴随迁移的ApplicationDbContextModelSnapshot
。
这个类是自动生成的,需要与您当前的迁移级别保持一致。
我能够通过从_MigrationHistory表中删除上次迁移的记录来解决这个问题。在我将DbSet for新模型对象添加到DbContext类之前,这个记录被错误地创建了。在此删除之后,使用正确的Up()和Down()方法创建了新的迁移。
我有这个问题,因为我忘记添加{get;
你需要将你的表添加到DbContext类的实现中,例如,当将现有的EF Core Data Context回滚为空时,我的迁移不会生成,直到我删除了伴随迁移的ApplicationDbContextModelSnapshot。
在我的例子中,数据上下文项目是一个类库项目。它不同于启动项目是asp.net mvc 5项目。现在由于错误,启动项目中的连接字符串指向不同的数据库。
确保数据上下文项目和启动项目指向相同的数据库。也可以使用问题中提到的完整命令,如下所示。您也可以包括-Force。
add-migration "InitialMigration" -verbose -ProjectName "MyEFproject" -Force
另外:确保您添加的任何新属性都是公共的!
在我的情况下,我正在做一个迁移,我添加字段到一个现有的表,并最终与空Up
和Down
方法,
我有这样的东西:
public bool ExistingField { get; set; }
bool NewField { get;set; }
你能看出…的区别吗?
如果您犯了这个错误,请使用相同的名称重新运行迁移(您可能需要添加-Force
参数来支撑它)。
p。在尝试执行任何EF命令之前,一定要确保项目完全构建。如果你的项目还没有完成,那你就是在自找麻烦。
如果新表添加到Context中只需在"Migration/ExampleContextModelSnapshot"中删除新表
您需要在Dbset
中添加MyTable
,您的问题将得到解决:
public DbSet<MyTable> MyTables { get; set; }
当我错误地使用1-多关系而不是多-多关系关联两个表(即我忘记了一个导航属性)时,我添加了空迁移。我有一个播种文件,它期望有一个多多关系,但是在迁移过程中失败了,导致迁移失败。不幸的是,没有输出表明这是问题所在,只有通过使用实体框架电动工具(v4但安装在VS2015中),我才能直观地看到不正确的关系,并意识到这可能是原因。
我必须在添加此参数-TargetMigration:"{your-migration-name}"
的空迁移之前使用最新迁移更新数据库。
可能它会告诉你,我们尝试的下一个错误将会有数据丢失。如果你能负担得起,把-Force
附加到它上面。
然后我试着添加我的新Add-Migration
,它不是空的。
如果上面抛出异常,你可能需要做的最后一件事是去SQL Server管理工作室并删除最后一个Automatic migration
并尝试再次添加它。
我在EFcore上有同样的问题。重命名Phone ->移动,迁移结果为空。
My DbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyUser>()
.Property(c => c.Mobile)
.HasColumnName("phone");
}
问题是使用.HasColumnName("phone")
重写了实际的属性名称,所以EF可能看不到任何变化。更改字符串值使其工作。
在我想向数据库添加额外的列之后,我遇到了这个确切的问题。因为除非表为空,否则我的数据不会播种,所以我删除了所有表和迁移以重新创建表。当我尝试迁移时,迁移有空的up和down方法。
我通过删除快照文件来解决这个问题,因为这是造成问题的原因。因此,我删除了所有迁移和快照文件,再次添加迁移并运行更新数据库。用我的新列成功地更新了表和迁移。
如果您正在处理测试数据,那么更好的方法是运行down方法并像这样删除表。显然,在现实世界中,掉表是不好的。对我来说,问题是Id属性应该对应于表Id被命名为FeedbackId。我改为"Id",然后Up/Down不再是空的了。不知道这是否有帮助
如果你的项目很小,也就是说你还没有太多的迁移,你可以从你的迁移文件夹中删除所有。之后,再次添加迁移。
我认为当您尝试在模型中不做任何更改的情况下进行迁移时也会发生这种情况。当您执行迁移1并成功时,当您尝试执行迁移2而不对任何模型进行任何更改时,它将创建空的UP和Down。
从一个完整的实体框架(核心)初学者的角度:
- 创建将成为表的类
- 您可以拥有具有多对多或一对一关系的子类。
- 在步骤3中,您将看到两个属性具有一对一关系的上下文。
- 确保您有一个
DbContext
- 如果您有多个
DbContext
,您需要使用-Context
参数指定要将迁移添加到哪个上下文。
- 如果您有多个
- 将您的类添加到
DbContext
中,如@ conding阴谋所示- 作为参考实体框架核心DbSet
public class AccountContext : DbContext
{
public DbSet<Account> Accounts { get; set; }
public DbSet<SecretIdentity> SecretIdentity { get; set; }
}
- 输入
Add-Migration
我在使用Visual Studio Code时遇到了类似的问题。
我做了以下的修改:
- 检查您的
ContextModelSnapshot : ModelSnapshot
- 注释模型实体定义…
- 删除与这些实体相关的迁移文件
- 从
dbo.__EFMigrationsHistory
表中删除迁移 - 编译您的解决方案。
- 执行如下命令:
dotnet ef migrations add migrationName -p ProjectContainer/
dotnet watch run
临时删除
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
然后执行initial create
Add-Migration InitialCreate
如果在dbContext中添加类后,迁移仍然为空:执行以下操作:
在DbContextModelSnapshot类中,删除每个与您试图应用add-migration的类名相关的代码。保存DbContextModelSnapshot.cs并使用Add-Migration "Added_filename"
这个适合我。
在我的情况下,我完全删除了Migration文件夹。只要我没有删除applicationdbcontextmodelsnapshot;之前所有的迁移都失败了。
对我来说,这是因为我没有添加配置文件。
onModelCreating:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
}
和添加配置在相同的程序集派生自IEntityTypeConfiguration<T>
,其中T是你的模型。
在我的例子中,字段类型是
字符
作为结果up和down方法是空的,然后我用最大长度注释的字符串替换它,修复了这个问题。
[MaxLength(1)]
public string OrganizationType { get; set; }
迁移: public override void Up()
{
AddColumn("dbo.SupplierOrganization", "OrganizationType", c => c.String(maxLength: 1));
}
public override void Down()
{
DropColumn("dbo.SupplierOrganization", "OrganizationType");
}
我错过添加
{get;set}
添加getter和setter后,up和down方法不再为空。