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. Rails中的增删改查

      1.        rails中类与对象与SQL中表与行的关系 rails中提供了对象关系映射(ORM),将模型类映射至表,模型类的关联表名是类名小写后的复数形式,如类名Order,对应的表名为o ...

  2. springboots Helloworld

    1.eclipse gradle 插件 HELP----MarketPlace----搜索 buildship点击安装 WINDOW----preferences--gradle 配置安装好的grad ...

  3. 使用eclipse 开发lisp

    https://www.ibm.com/developerworks/cn/opensource/os-eclipse-lispcusp/ eclipse有一个插件,可以支持lisp的开发,叫cusp ...

  4. java 获取控制台输入

    读取控制台输入 从控制台读取一行数据,返回值字符串 public class IO { public static void main(String args[]) throws IOExceptio ...

  5. mysql 优化海量数据插入和查询性能

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  6. PHP报错Deprecated: Function ereg_replace() is deprecated in

    可能用了PHP5.3乃至更高的PHP版本,目前DEDE中有很多地方的正则函数都用的ereg_replace,而这个函数现在在PHP5.3中已经被废止了. 解决办法: 如果一定要用php5.3,请修改p ...

  7. opencv3.2.0形态学滤波之形态学梯度、顶帽、黑帽

    /*一.形态学梯度 (1)含义:是膨胀图和腐蚀图之差 (2)数学表达式:dst=morph-grad(src,element) =dilate(src,element) - erode(src,ele ...

  8. CentOS7系列--3.1CentOS7中配置NFS服务

    CentOS7配置NFS服务 1. 配置NFS服务器端 1.1. 安装nfs-utils软件 [root@server1 ~]# yum install -y nfs-utils Loaded plu ...

  9. Keras vs. PyTorch in Transfer Learning

    We perform image classification, one of the computer vision tasks deep learning shines at. As traini ...

  10. maven jstl、jsp、servlet依赖

    jstl.jsp.servlet依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId> ...