我错误地认为,如果我删除了数据库中的表,那么 EF 会在下次运行 update-database 时重新创建一个空表。
现在我有一个丢失的表,因此应用程序每当遇到对其的引用时都会引发异常。
有没有办法告诉EF重新建表而不完全删除数据库?
问题是 EF 在上次迁移的快照中包含该表,因此如果您希望 EF 重新创建它,您可以这样做:
1) 通过注释掉 DbSet 和 OnModelCreating(如果存在)来暂时删除该类。
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();
}
在 SSOX 中,如果找到
Tables
文件夹,您将找到名为 __MigrationHistory
的文件夹。删除那个并运行 Update-Database
。这应该根据您拥有的架构重新创建表。