已删除数据库中的表.如何让实体框架重新制作它

本文关键字:实体 框架 新制作 数据库 删除 | 更新日期: 2023-09-27 17:55:59

我错误地认为,如果我删除数据库中的表,那么下次运行更新数据库时,EF 会重新创建一个空表。

现在我有一个缺少表,因此应用程序在遇到对它的引用时都会引发异常。

有没有办法告诉 EF 在不完全删除数据库的情况下重新制作表?

已删除数据库中的表.如何让实体框架重新制作它

问题是 EF 在上次迁移的快照中具有该表,因此如果您希望 EF 重新创建它,您可以这样做:

1) 通过注释掉 DbSet 和 OnModelCreate(如果存在)来暂时删除该类。

2) 运行迁移,以便 EF 从快照中删除表。您需要注释掉 Up() 方法中的代码,该方法删除了该表,因为它已被删除。

3) 取消注释步骤 1 代码。

4) 运行另一个迁移以重新添加表。

https://msdn.microsoft.com/en-US/data/dn481501?f=255&MSPPError=-2147217396

只需从 DbContext 和更新中注释表属性.之后Un Comment属性并更新 这将创建一个新表而不删除整个数据库(这适用于我 通过包管理器控制台更新时)

1) 从头开始在计算机中本地创建数据库

2) 使用 SSM 打开数据库并选择所需的表

3) 鼠标右键单击表并选择"将表脚本为",然后选择"创建到" -->这将生成表 Sql 字符串

4) 在应用程序 ExecuteSqlCommand 中执行生成查询

我的电脑示例:

string toBeCreatetable = @"  
CREATE TABLE [dbo].[Customers]( 
    [CustomerId] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](max) NULL, 
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED  
( 
    [CustomerId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]"; 
// Somewhere in code before at the begin do:    
using (var ctx = new myDbContext(toBeCreatetable))
{
    int executed= myDbContext.Database.ExecuteSqlCommand()
}

这是保证迁移历史记录与概念模型正确使用的最佳方法。

  1. 在迁移快照中,注释掉与已删除的特定表相关的代码。

  2. 添加迁移修复

  3. 更新数据库

  4. 将重新创建表

  5. 如果您在代码中使用 DBintializer 例程,请让它检查表中存在的任何数据 - 如果没有,则重新填充您的表

     if (!context.MyDBSet.Any())
     {
         var myData = new TableData[]
             {
     new TableData{ Data = null },
     new TableData{ Data = "Yes" },
     new TableData{ Data = "No" },
             };
         foreach (TableData d in myData)
         {
             context.MyDBSet.Add(d);
         }
         context.SaveChanges();
     }