Asp.net Core 由于依赖注入的广泛使用,配置数据迁移,与Asp.net大不相同,本篇介绍一下Asp.net Core添加数据迁移的过程

添加Nuget包

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools

Install-Package Microsoft.EntityFrameworkCore.Design

首先新建一个 Model 类 User:

public class User

    {

        //用户编号(自增长主键)

        [Key]

        public long UserId { get; set; }

        //用户名(必填项)

        [MaxLength(30),Required]

        public string UserName { get; set; }

        //密码(必填项)

        [MaxLength(16),DataType(DataType.Password),Required]

        public string Password { get; set; }

    }

然后建立MyDbContext类

   public class BlogDbContext:DbContext

    {

    //由于依赖注入的关系,不加构造函数这里会出现警告,但不影响数据迁移文件的建立,更新数据库也没影响

        public BlogDbContext(DbContextOptions<BlogDbContext> options):base(options)

        {

        }

        protected override void OnConfiguring(DbContextOptionsBuilder builder)

        {

            //添加数据库连接字符串

            builder.UseSqlServer(@"Server=.;User id=sa;Password=123;Database=BlogDbContext");

        }

        protected override void OnModelCreating(ModelBuilder builder)

        {

            base.OnModelCreating(builder);

            //添加FluentAPI配置

            var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);

            foreach(var type in typesToRegister)

            {

                dynamic configurationInstance = Activator.CreateInstance(type);

                builder.ApplyConfiguration(configurationInstance);

            }

        }

        //User相关表

        public DbSet<User> Users { get; set; }

    }
    

然后配置AppSetting.json,添加数据库连接字符串:

      "ConnectionStrings": {

        "DefaultConnection": "Server=.;User Id=sa;Password=123;Database=BlogDbContext;"

      },

在Startup.cs文件中注入数据库服务:

        public void ConfigureServices(IServiceCollection services)

        {

            services.AddDbContext<BlogDbContext>(options =>
options.UseSqlServer("DefaultConnection"));
            services.AddMvc();         }

然后就可以进行数据迁移了,由于Asp .net Core 默认开启数据迁移,所以直接添加数据迁移就可以了

  Add-Migration Init

下面添加种子数据,这里不得不说踩过的一个大坑,添加种子数据的时候不仅与EF6.0 大不相同,跟EF Core1.X也大相径庭,也怪自己,不去看官方文档,非要去找教程(目前网上大部分教程都是1.x),哎,说多了都是泪。

有大佬指出,这里用的方法不是种子,去看了看官方文档,EF Core中并没有Seed方法,所以这里时添加测试数据,并不是种子。

添加一个初始化数据类,命名为SeedData.cs

 		public static class SeedData

        {

            /// <summary>

            /// 

            /// 配置测试数据

            /// 

            /// </summary>

            public static void Initialize(IServiceProvider app)

            {

                var _dbContext= app.GetRequiredService<BlogDbContext>();

                

                //如果已经有数据就直接返回

                if(_dbContext.Users.Any())

                {

                    return;

                }

                    //添加User测试数据

                    _dbContext.Users.Add(new User { UserName = "Niko", Password = "123" });

    

                    _dbContext.SaveChanges();

    

            }

        }

与EF Core 1.x不同的是,2.0是在Program.cs里的Main方法里(1.x是在Startup.cs中的Configure方法中)添加初始化方法。修改Main方法为:

			public static void Main(string[] args)

            {

                var host = BuildWebHost(args);

                using (var scope = host.Services.CreateScope())

                {

                    var services = scope.ServiceProvider;

                    try

                    {

                        SeedData.Initialize(services);

                    }

                    catch(Exception ex)

                    {

                        var logger = services.GetRequiredService<ILogger<Program>>();

                        logger.LogError(ex, "An error occurred seeding the DB");

                    }

                }

                    host.Run();

            }

接下来更新数据库

 Update-Database -Verbose

没有问题,去数据库里查看,添加的 种子数据 测试数据并没有加进来SQL Profile中并没有监测到添加数据操作。在Main方法加个断点,启动IIS执行,逐步执行,发现,只有在程序运行的时候,才会添加种子 测试数据到数据库。

Asp.net Core 2.0+EntityFrameWorkCore 2.0添加数据迁移的更多相关文章

  1. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  2. ASP.NET Core教程【二】从保存数据看特有属性与服务端验证

    前文索引: 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" class="navbar-brand" ...

  3. ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证

    前文索引:ASP.NET Core教程[一]关于Razor Page的知识 在layout.cshtml文件中,我们可以看到如下代码: <a asp-page="/Index" ...

  4. 升级 asp.net core 1.1 到 2.0 preview

    Upgrading to .NET Core 2.0 Preview 1 更新 依赖的类库 改为 标准库 2 web app  更改 csproj 文件---升级版本 <PropertyGrou ...

  5. ASP.NET Core学习之五 EntityFrameworkCore

    目的:运用EntityFrameworkCore ,使用codefirst开发 一.创建web项目 创建一个不进行身份验证的   ASP.NET Core Web Application (.NET ...

  6. 011.Adding Search to an ASP.NET Core MVC app --【给程序添加搜索功能】

    Adding Search to an ASP.NET Core MVC app 给程序添加搜索功能 2017-3-7 7 分钟阅读时长 作者 本文内容 1.Adding Search by genr ...

  7. ASP.NET CORE RAZOR :向 Razor 页面添加验证

    https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/validation 本部分中向 Movie 模型添加了验证逻辑. ...

  8. Asp.net core通过自定义特性实现双端数据验证的一些想法

    asp.net core集成了非常方便的数据绑定和数据校验机制,配合操作各种easy的vs,效率直接高到飞起. 通过自定义验证特性(Custom Validation Attribute)可以实现对于 ...

  9. 在ASP.NET Core中用HttpClient(一)——获取数据和内容

    在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用Ht ...

随机推荐

  1. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  2. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  3. 扩展jquery插件的方式

  4. 十八、curator recipes之DistributedDelayQueue

    简介 curator实现了类似DelayQueue的分布式延迟队列 官方文档:http://curator.apache.org/curator-recipes/distributed-delay-q ...

  5. SpringBoot集成Jersey

    SpringBoot集成Jersey 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> & ...

  6. Struts框架的执行流程或原理

    Struts2的执行流程如下: 1.浏览器发送请求,经过一系列的过滤器,到达StrutsPreapareAndExecteFilter 2.StrutsPrepareAndExectueFilter通 ...

  7. 《Programming iOS 7》读书笔记 - 窗体大小与状态栏

    1.从iOS7开始,状态栏开始变为透明的,根识图占领了整个窗体,包括状态栏后面的20像素高的区域,这种样式无法被改变.iOS6的状态栏是不透明的,窗体的尺寸通常会比屏幕的尺寸要小,可以设置窗体的尺寸为 ...

  8. SpingMVC_注解式开发_接收请求参数

    一.逐个接收 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotat ...

  9. vue + element ui 阻止表单输入框回车刷新页面

    问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止 ...

  10. JS 自定义对象 属性

    js自定义对象 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在J ...