已删除数据库中的表.如何让实体框架重新制作它
本文关键字:实体 框架 新制作 数据库 删除 | 更新日期: 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()
}
这是保证迁移历史记录与概念模型正确使用的最佳方法。
-
在迁移快照中,注释掉与已删除的特定表相关的代码。
-
添加迁移修复
-
更新数据库
-
将重新创建表
-
如果您在代码中使用 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(); }