EF CodeFirst下,当实体结构发生修改怎么更新数据库结构

在使用EF的实际编程中我们经常遇到这样的问题:发现实体结构需要新增加一个字段,或者减少一个字段,急需把实体结构修改,并让数据库更新这种修改。在用Model First或者Database First的情况下我们可以通过在实体视图界面下生成更改数据库数据结构的sql语句,然后通过执行这些sql语句来完成数据库的修改。可Code First下应该怎么办呢。


其实我们可以通过程序包管理控制台的命令来完成这种修改:

如下面的实体类代码,红底黄字部分是我添加的一个新的字段,现在我需要让数据库也跟着进行改变:

public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public string Author { get; set; }

        public decimal Price {get;set;}

        public List<BookReview> Reviews { get; set; }

    }

首先打开程序包管理控制台:


在程序包管理控制台输入命令:enable-migrations


可以看到,系统出现提示,大体意思是我的这个程序集中有多个上下文类型(我这是一个做实验的程序集,创建了两个EF上下文类型)。一般情况下不会出现这个提示,一个程序集中有多个上下文类型才会出现这个提示。

出现这种提示之后在提示的命令中选择一个,决定要对哪个上下文类型进行迁移就行了,我选择迁移我的“EF原理探究.BookDb”,那么只需要按照提示急需在程序包管理控制台输入:Enable-Migrations -ContextTypeName EF原理探究.BookDb。


在运行完命令之后就会发现自己的项目文件里面多了一个Migrations文件,下一步我们需要对这个文件进行操作。

打开Migrations文件夹下面的Configuration.cs文件会发现代码如下:

internal sealed class Configuration : DbMigrationsConfiguration<EF原理探究.BookDb>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;

            AutomaticMigrationDataLossAllowed = true;//这是我自己添加的

        }


        protected override void Seed(EF原理探究.BookDb context)
        {
            //  This method will be called after migrating to the latest version.


            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }

我们只需在Configuration类的构造函数里面插入一句:AutomaticMigrationDataLossAllowed = true;就行了。然后在程序包管理控制台输入命令:updata-database就完成了这种修改,当然,很多情况下运行updata-database修改会报错,如果报错我们可以强制运行,只需加上一个参数-force,完整命令:updata-database -force


这样就代表迁移成功了!

当然,也有朋友喜欢直接更改数据库的方式完成数据库与实体类的统一,但是这有一个问题,如果在更改了实体类之后直接更改数据库,在统计数目的时候,如db.实体类.count();会发现数据不对,制定了新字段的数据会统计不进来,各种问题。


  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个简单的仓储系统数据库设计,使用 .NET EF Core Code First: ```csharp public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int Quantity { get; set; } public int WarehouseId { get; set; } public Warehouse Warehouse { get; set; } } public class Warehouse { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public List<Product> Products { get; set; } } public class Order { public int Id { get; set; } public DateTime OrderDate { get; set; } public int ProductId { get; set; } public Product Product { get; set; } public int Quantity { get; set; } public decimal TotalPrice { get; set; } } public class WarehouseContext : DbContext { public DbSet<Product> Products { get; set; } public DbSet<Warehouse> Warehouses { get; set; } public DbSet<Order> Orders { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=WarehouseDb;Trusted_Connection=True;"); } } ``` 上述代码定义了三个实体类:Product、Warehouse 和 Order,它们分别表示产品、仓库和订单。每个产品都属于一个仓库,一个仓库可以包含多个产品。订单中包含了要购买的产品和数量以及总价。DbContext 包含了三个 DbSet 属性,分别对应这三个实体类的数据库表。在 OnConfiguring 方法中,使用 UseSqlServer 方法指定了数据库连接字符串。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤行者程序之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值