博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework Core迁移时出现数据库已存在对象问题解决方案
阅读量:5825 次
发布时间:2019-06-18

本文共 6603 字,大约阅读时间需要 22 分钟。

前言

刚开始接触EF Core时本着探索的精神去搞,搞着搞着发现出问题了,后来就一直没解决,觉得很是不爽,借着周末好好看看这块内容。

EntityFramework Core迁移出现对象在数据库中已存在

在EF Core之前对于迁移的命令有很多,当进行迁移出现对象已在数据库中存在时我们通过如何命令即可解决:

Add-Migration Initial -IgnoreChanges

但是在EF Core对于迁移现如今只存在如下两个命令:

dotnet ef migrations add <
>dotnet ef database update

当我们第一次进行初始化迁移时,表结构完全生成通过 dotnet ef migration add initial 来初始化表,当下次再进行迁移时因为这样或者那样无意的操作导致出现如下结果

翻译成英语则是如下的情况:

There is already an object named in the database

如下为第一次初始化的迁移文件,如下:

public partial class initial : Migration    {        protected override void Up(MigrationBuilder migrationBuilder)        {            migrationBuilder.CreateTable(                name: "Blog",                columns: table => new                {                    Id = table.Column
(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), Code = table.Column
(nullable: false), Count = table.Column
(nullable: false), Name = table.Column
(nullable: true), Url = table.Column
(nullable: true) }, constraints: table => { table.PrimaryKey("PK_Blog", x => x.Id); }); migrationBuilder.CreateTable( name: "Book", columns: table => new { Id = table.Column
(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), Name = table.Column
(nullable: true) }, constraints: table => { table.PrimaryKey("PK_Book", x => x.Id); }); migrationBuilder.CreateTable( name: "Category", columns: table => new { Id = table.Column
(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), Name = table.Column
(nullable: true), ProductId = table.Column
(nullable: false) }, constraints: table => { table.PrimaryKey("PK_Category", x => x.Id); }); migrationBuilder.CreateTable( name: "Product", columns: table => new { Id = table.Column
(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), Code = table.Column
(nullable: true), Name = table.Column
(nullable: true) }, constraints: table => { table.PrimaryKey("PK_Product", x => x.Id); }); migrationBuilder.CreateTable( name: "Post", columns: table => new { Id = table.Column
(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), BlogId = table.Column
(nullable: false), Content = table.Column
(nullable: true), Title = table.Column
(nullable: true) }, constraints: table => { table.PrimaryKey("PK_Post", x => x.Id); table.ForeignKey( name: "FK_Post_Blog_BlogId", column: x => x.BlogId, principalTable: "Blog", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "ProductCategory", columns: table => new { Id = table.Column
(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), CategoryId = table.Column
(nullable: false), ProductId = table.Column
(nullable: false) }, constraints: table => { table.PrimaryKey("PK_ProductCategory", x => x.Id); table.ForeignKey( name: "FK_ProductCategory_Category_CategoryId", column: x => x.CategoryId, principalTable: "Category", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_ProductCategory_Product_ProductId", column: x => x.ProductId, principalTable: "Product", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( name: "IX_Post_BlogId", table: "Post", column: "BlogId"); migrationBuilder.CreateIndex( name: "IX_ProductCategory_CategoryId", table: "ProductCategory", column: "CategoryId"); migrationBuilder.CreateIndex( name: "IX_ProductCategory_ProductId", table: "ProductCategory", column: "ProductId"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "Book"); migrationBuilder.DropTable( name: "Post"); migrationBuilder.DropTable( name: "ProductCategory"); migrationBuilder.DropTable( name: "Blog"); migrationBuilder.DropTable( name: "Category"); migrationBuilder.DropTable( name: "Product"); }

此时为了解决上述问题前提是最初的迁移类文件还在,我们需要将Up方法里面的数据全部删除而对于Down方法里面的数据可删除可不删除

public partial class initial : Migration    {        protected override void Up(MigrationBuilder migrationBuilder)        {}        protected override void Down(MigrationBuilder migrationBuilder)        {              ........           }    }

通过Up方法来创建表或者修改列,通过Down方法来删除表或者修改列。上面我们创建了BlogType列,此时我们在映射时将其删除同时在Blog类中删除此字段,如下:

public class BlogMap : EntityMappingConfiguration
{ public override void Map(EntityTypeBuilder
b) { b.ToTable("Blog"); b.HasKey(k => k.Id); b.Property(p => p.Count); b.Property(p => p.Url); b.Property(p => p.Name); b.Property(p => p.Code).IsRequired(); //b.Property(p => p.BlogType).HasColumnType("TINYINT").IsRequired(); } }

此时我们再来进行迁移如下:

dotnet ef migrations add removeBlogType

此时将不会再报错且生成的removeBlogType迁移类文件如下:

public partial class removeBlogType : Migration    {        protected override void Up(MigrationBuilder migrationBuilder)        {            migrationBuilder.DropColumn(                name: "BlogType",                table: "Blog");        }        protected override void Down(MigrationBuilder migrationBuilder)        {            migrationBuilder.AddColumn
( name: "BlogType", table: "Blog", type: "TINYINT", nullable: false, defaultValue: (byte)0); } }

我们需要再次确保生成的迁移类文件是否是我们需要修改的字段或者对列进行修改的方法是否正确,确保无误后,接下来再来通过 dotnet ef database update 更新到数据库中

 

如上通过意外情况导致上述错误,若是将最初迁移的整个文件夹删除了肿么办,这个时候真的没有好的办法了,我能想到的是:最好事先在建立项目时建立数据库对比文件,此时就会派上用场不用一个个类去核对表同时也利于部署时进行数据迁移。

总结

本文我们讲到了在EF Core迁移时可能出现的意外情况,若是删除了最初的迁移类文件也给出了能够想到的方案,不知看到此文的你有何高见?连续发表的EF Core文章都是在项目使用中遇到的问题,所以借此机会重新过了一遍,欢迎一起探讨。

本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/7043350.html,如需转载请自行联系原作者

你可能感兴趣的文章
Android状态栏实现沉浸式模式
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
HCNA——RIP的路由汇总
查看>>
zabbix监控php状态(四)
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>
SSH中调用另一action的方法(chain,redirect)
查看>>
数据库基础
查看>>
表格排序
查看>>
关于Android四大组件的学习总结
查看>>
java只能的round,ceil,floor方法的使用
查看>>