您怎样创设,Core迁移数据库到SQL

前言

只要大家刚使用EntityFramework
Core作为OPRADOM框架的话,想必都会遇上数据库迁移的局地标题。

开端我是在ASP.NET
Core的Web项目中展开的,但新兴意识放在此处并不是很合理,一些关于数据库的迁移,比如新增表,字段,修改字段类型等等,不应有和最上层的Web项目所涉及,数据的搬迁文件放到那里也感到有点多余,有点乱乱的感觉,所以才想着单独出来由尤其的项目实行管理会比较好,也正如清晰!

瞩目目的框架选用的是.NET Core 2.0而不是.NET
Standard 2.0。

正文版权归天涯论坛和作者李继宏共同享有,欢迎转发,转发和爬虫请评释今日头条蜗牛原著地址 http://www.cnblogs.com/tdws/p/5874212.html。  

0、早先时期准备

a)、表实体定义,这么些是在.NET
Standard 2.0的类库中存放的。

    /// <summary>
    /// 系统应用的用户实体
    /// </summary>
    public class ApplicationUser : BaseModel
    {
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }

        /// <summary>
        /// 邮件地址
        /// </summary>
        public string Email { get; set; }
    }

b)、新建2个.NET Core
2.0的类库,并定义好大家所要使用的数据库上下文,很粗大略,接下去初始大家的正文

    /// <summary>
    /// 系统上下文
    /// </summary>
    public class LightContext : DbContext
    {
        public LightContext(DbContextOptions<LightContext> options) : base(options)
        {
        }

        /// <summary>
        /// 系统应用用户
        /// </summary>
        public DbSet<ApplicationUser> ApplicationUser { get; set; }

        /// <summary>
        /// 角色表
        /// </summary>
        public DbSet<Role> Role { get; set; }
    }

此时此刻境内各大论坛,各位大牌的享用,是比照Microsoft官方文书档案,在Web层直接选用EF
Core。当然那并没有怎么难点,因为自个儿也要从文书档案开头享用。唯一多的少数就是在Dal层中调用DbContext的法子。你在此以前用的EF6.x,如若在测试代码中你能够直接new出来,在行业内部的门类费用中,你说了算上下文线程内唯近来,也足以new四个指标。可是!在EF Core中您不能那样做。

一 、难点汇聚

首先要保险仓储类库中早已引入以下三个Nuget包,没有的话请使用包管理器实行设置。不建议直接引入原包:Microsoft.AspNetCore.All,按需引入即可

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools

a)打开CMD,然后切换成类库所在路径下,执行以下命令。不过你也足以动用程序包管理器控制台(PMC)进行搬迁,可是会有星星点点变化,部分命令见下表:

迁移命令描述 CMD命令 PMC命令
创建迁移:migrationname为迁移名称 dotnet ef migrations add migrationname add-migration migrationname
移除迁移(删除最近的一次迁移) dotnet ef migrations remove remove-migration
应用最新的迁移(使迁移文件应用到数据库) dotnet ef database update update-database
应用指定的迁移 dotnet ef database update migrationname update-database migrationname
查看迁移列表 dotnet ef migrations list  
查看数据库上下文信息 dotnet ef dbcontext info  
dotnet ef

图片 1

错误提醒:

  未找到与命令“dotnet-ef”匹配的可执行文件

消除措施:

  在类型文件Light.Repository.csproj中添加以下节点

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />
</ItemGroup>

重复履行下面的授命,即使现身了EF
Core的标志(三头蓄势待发的野马)表示早已打响

图片 2

 b)、执行以下命令举办搬迁

dotnet ef migrations add InitLightDB

图片 3

荒谬提醒:

The specified framework version ‘2.0’ could
not be parsed
The specified framework
‘Microsoft.NETCore.App’, version ‘2.0’ was not found.

  • Check application dependencies and
    target a framework version installed at:
    \
  • Alternatively, install the framework
    version ‘2.0’.

缓解格局:

  在项目文件中添加以下节点:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>
  </PropertyGroup>

c)、重新履行b步骤的指令,报错音信如下:

图片 4

错误提醒:

  Unable to create an object of type
‘LightContext’. Add an implementation of
‘IDesignTimeDbContextFactory<LightContext>’ to the project, or see
https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns
supported at design time.

以此标题假若是在Web项目,并且铺排了DbContext的链接字符串的话,是不会并发此题材的。很显眼是迁移命令没有找到DbConnectionString导致的,接下去大家根据提醒,达成一个IDesignTimeDbContextFactory<LightContext>试试

涸泽而渔办法:

  创造一个与DbContext同一目录下的DesignTimeDbContextFactory文件,然后达成接口中的方法CreateDbContext,并安顿ConnectionString

   public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>
    {
        public LightContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<LightContext>();
            builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");
            return new LightContext(builder.Options);
        }
    }

 再一次实施迁移命令,终于成功了。

图片 5

打响唤醒:

  Done. To undo this action, use ‘ef
migrations remove’

并且类库上边会生成Migrations文件夹以及相关的迁徙文件

图片 6

在EF6.x中,你的前后文类中是那样的,在构造方法中从未其余参数。

贰 、小规模试制迁移命令

a)、使用以下命令应用迁移,生成数据库和表

dotnet ef database update

图片 7

由此VS的SQL
Server能源管理器查看生成数据库的结构,在那之中__EFMigrationsHistory为每便迁移的记录表

图片 8

b)、因为string类型的字段迁移到数据库之后的数据类型为nvarchar(max)并且是可空类型的,上面我们就使用Fluent
API对ApplicationUser表字段进展布局,同样你也得以行使性质注明的章程展开布署,因为自个儿自个儿不希罕“污染”表实体

    public static void ConfigApplicationUser(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ApplicationUser>(m =>
            {
                m.Property(t => t.Email)
                        .HasMaxLength(50);

                m.Property(t => t.UserName)
                        .IsRequired()
                        .HasMaxLength(50);

                m.Property(t => t.Password)
                        .IsRequired()
                        .HasMaxLength(20);
            });
        }

下一场同样使用方面包车型大巴两条命令重新迁移并创新数据库结构

图片 9

观测数据库表结构已经更新

图片 10

 同理添加字段,删除字段都是相同的迁徙操作,依旧很有益的

图片 11

3、扩展

a)、为了有利于演示,其实上边在类库中履行迁移时的数据库连接字符串是写死的,那么最棒的点子是相应去读取Web项目下一度计划好的连年,那样就能确定保证上下的一致性,不用再去为了EF的动员搬迁而单身维护2个剩余的数据库连接配置。改造也很不难,即经过Configuration组件读取appsettings.json的ConnectionStrings节点,改造之后是那样子的:

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>
    {
        public LightContext CreateDbContext(string[] args)
        {
            Directory.SetCurrentDirectory("..");//设置当前路径为当前解决方案的路径
            string appSettingBasePath = Directory.GetCurrentDirectory() + "/Light.AuthorityApi";//改成你的appsettings.json所在的项目名称
            var configBuilder = new ConfigurationBuilder()
                .SetBasePath(appSettingBasePath)
                .AddJsonFile("appsettings.json")
                .Build();

            var builder = new DbContextOptionsBuilder<LightContext>();
            //builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");
            builder.UseSqlServer(configBuilder.GetConnectionString("LightConnection"));
            return new LightContext(builder.Options);
        }
    }

留意需求卓殊引入上边这几个Nuget包:

Install-Package Microsoft.Extensions.Configuration.Json

b)、属性注解[Column(Order = 1)]对EF
Core来说还没有达到规定的标准能够调整数据库生成字段的次第,不过我们仍是能够修改迁移文件的实业性质的相继来完毕我们想要的效益。下边是本人调动之后再度生成的表,是否看出来和地点的有哪些分歧,一图胜万语:

图片 12

 c)、最终一步,自身动手试试看:创设1个SeedData迁移文件来添加数据库的开端数据。:)

你创建线程内唯一的上下文的法子可能是那样的。

4、最后

EF
Core的强大远不止这么些,还有越多的施用情势等着大家去发现,去探索。每日升高一丢丢,是件很喜欢的政工!

图片 13

忆起了EF6.x以及此前的本子,上边进入本篇分享的正文。英文官方文书档案地址https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html#

率先小编新建了.NET Core WebApplication,ConsoleApp和几个.NET
Core类库,临时就先来3个BLL,DAL多个类库吧。

图片 14

赶尽杀绝方案如下:

图片 15

 在类库和ConsoleApp和WebApi中都从nuget上安装好EF
Core.SqlServer和design。你能够经过nuget可视化管理也足以透过nuget控制台命令。命令如下:

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

图片 16

除此以外你还亟需使用如下命令安装tool。并且修改Dal层类库项指标project.json,增添tools节点。

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

图片 17

 "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  }

 

 

鉴于是DB First,还要成立你的测试数据库,像上面那样。

图片 18图片 19

下一步,在您想添加EF的Dal层的nuget控制台,执行以下命令,连接数据库的连带音讯,别忘了修改:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=AppDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

那就是自笔者的布置。

 Scaffold-DbContext "Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

自然一贯实施这段,你肯定会际遇一个近似上边的错误。由于您的启航项目是Web,近来您还尚未做项目应该享有的引用,所以它报告您找不到DAL.dll。

解决办法当然正是UI引用BLL,BLL引用DAL,重新生成一下后再行实施该命令。还有假设提醒让您dotnet
restore一下,这您就举行一下。

图片 20

图片 21

图片 22

 

事业有成之后您会意识DAL层中多了三个Model文件夹,并且将你的数据库表映射出实体类,别的还有DbContext类。

图片 23

接下去看一下怎样来拍卖你的DbContext。Miscrosoft告诉我们须求将如下代码做修改。

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
            optionsBuilder.UseSqlServer(@"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;");
        }

修改后是那样的:

        //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        //{
        //    #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
        //    optionsBuilder.UseSqlServer(@"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;");
        //}
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options)
        { }

在您的WebAPI恐怕您的MVC的Startup.cs做如下修改。在其ConfigureServices方法,添加以下代码,connection字符串还是要记得修改:

  services.AddApplicationInsightsTelemetry(Configuration);
  var connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;"

履行如下添加代码,看起来和EF6.x没什么分歧。唯一的分别就在于DbContext对象,通过.NET
Core框架自动为我们做构造函数看重注入IOC。

图片 24

图片 25

到此我们在Web/WebApi中操作dbContext成功。那么只要您要在Dal层操作,怎么办?这几个_dbContext没有了依靠注入,什么人来给我们对象?自个儿new叁个,不过我们的构造函数摆在那里,不是唯有的New就足以操作了。

在你实在起先打算new3个的时候,你发觉要求2个DbContextOption<AppDbContext>的指标。

图片 26

这我们New2个DbContextOption<T>对象啊。你看到重载要求这几个参数。

图片 27

重载说道:你相似伊始化一个实例使用重写DbContext.OnConfiguring方法,也许选用DbContextOptionBulider<T>来成立贰个实例。由于咱们所需对象为泛型DbContextOption<T>的目的,可是前者的重载方法毫无泛型。也说不定是笔者动用有误,尽管您有好的完成,请留下提出。

 1  public class UserDal
 2     {
 3         static string connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;";
 4         static DbContextOptions<AppDbContext> dbContextOption = new DbContextOptions<AppDbContext>();
 5         static DbContextOptionsBuilder<AppDbContext> dbContextOptionBuilder = new DbContextOptionsBuilder<AppDbContext>(dbContextOption);
 6         AppDbContext _dbContext = new AppDbContext(dbContextOptionBuilder.UseSqlServer(connection).Options);
 7         public int AddUser()
 8         {
 9             _dbContext.Users.Add(new Users { Name = "ws4", Email = "wscoder@outlook.com" });
10             return _dbContext.SaveChanges();
11         }
12     }

在ConsoleApp中调用,添加成功

图片 28

 

比方自己的星星点点分享,对您有点滴辅助,欢迎点赞,也为您协调的获得点赞。

遥远分享,欢迎点击下方关切。祝大家仲中秋乐呵呵!

夜里喝个红牛又喝点茶,一直到凌晨五点钟也不困…腰疼。,有个博士朋友平日和本身说,你见过凌晨三点的毕尔巴鄂吧?今后睡一觉,醒来去问问他见没见过凌晨五点的苏州。

最后作者有个难题,EF Core如今支撑Code First吗? 没看到相关文书档案。

EF
Core如何保险上下文线程内唯一?没有CallContext…,也不可能用HttpContext.Current.Item,有人
操作过吗?

 

相关文章

admin

网站地图xml地图