我错误地认为如果我删除了数据库中的表,那么EF下次运行update-database时会重新创建一个空表。
现在我有一个缺少的表,因此应用程序在遇到对它的引用时会抛出异常。
有没有办法让EF重新制作表而不完全删除数据库?
答案 0 :(得分:1)
问题是EF在上次迁移的快照中有表,所以如果你想让EF重新创建它,你可以这样做:
1)通过注释掉DbSet和OnModelCreating(如果存在)暂时删除该类。
2)运行迁移,以便EF从快照中删除表。您需要注释掉Up()方法中删除表的代码,因为它已被删除。
3)取消注释第1步代码。
4)运行另一次迁移以重新添加表格。
https://msdn.microsoft.com/en-US/data/dn481501?f=255&MSPPError=-2147217396
答案 1 :(得分:0)
只需注释来自DbContext
和更新的表属性。然后Un Comment
属性和更新这将创建一个新表而不删除整个数据库(这适用于我在通过包管理器控制台进行更新时)
答案 2 :(得分:0)
1)从头开始在您的计算机本地创建数据库
2)用SSM打开数据库并选择所需的表
3)在表格上单击鼠标右键,然后选择“脚本表为”,然后选择“创建到” - >这将生成表创建为Sql string
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()
}
这是保证迁移历史记录能够正确使用概念模型的最佳方法。