已删除数据库中的表。如何获得实体框架来重制它?

问题描述 投票:0回答:5

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

现在我有一个丢失的表,因此应用程序每当遇到对其的引用时都会引发异常。

有没有办法告诉EF重新建表而不完全删除数据库?

c# entity-framework
5个回答
2
投票

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

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

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

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

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

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


1
投票

只需注释

DbContext
和更新中的表属性。之后
Un Comment
属性和更新这将创建一个新表,而无需删除整个数据库(这对我来说很有效,同时通过包管理器控制台进行更新)


0
投票

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()
}

这是保证迁移历史能够与概念模型正常配合的最佳方式。


0
投票
  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();
     }
    

0
投票

在 SSOX 中,如果找到

Tables
文件夹,您将找到名为
__MigrationHistory
的文件夹。删除那个并运行
Update-Database
。这应该根据您拥有的架构重新创建表。

© www.soinside.com 2019 - 2024. All rights reserved.