做了一个.net MVC的练习,使用了EF,手动修改了Modal中的数据的类型,需要重新生成数据库。
使用下面的方法,虽然不是最好的,权且记录一下。
背景说明
正常情况下,在PMC中执行如下命令
代码语言:text复制Add-Migration InitialCreate
会在项目中生成一个这样的文件,
Migrations/{timestamp}_InitialCreate.cs
该文件的内容如下:
代码语言:c复制using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MvcMovie.Migrations
{
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Movie",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
ReleaseDate = table.Column<DateTime>(type: "datetime2", nullable: false),
Genre = table.Column<string>(type: "nvarchar(max)", nullable: true),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Movie", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Movie");
}
}
}
再执行
代码语言:text复制Update-Database
至此,数据库中会实际的表了。
问题
如果将modal中的某个字段的类型修改了,编译的时候会报错,将相关文件修改以后,需要将修改同步到数据库中。
执行如下命令,报错了。
代码语言:text复制Add-Migration InitialCreate
Update-Database
查看Migrations下的MvcMovieContextModelSnapshot文件,发现其中的类型并没有修改。
解决方法
很粗暴的解决方法,将Migrations下的MvcMovieContextModelSnapshot文件和{timestamp}_InitialCreate文件删除。将数据库也删掉。然后执行
代码语言:text复制Add-Migration InitialCreate
Update-Database
就好了。
显然这个方法是有问题的。下面这个文章写得貌似比较清楚。可参考。
https://zhuanlan.zhihu.com/p/196761386
另外,练习项目是参考的https://learn.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/adding-model?view=aspnetcore-7.0&tabs=visual-studio