你如何创立,Core迁移数据库到SQL

前言

若是我们刚使用EntityFramework
Core作为ORM框架的话,想必都会碰着数据库迁移的局地难点。

开头小编是在ASP.NET
Core的Web项目中举办的,但后来意识放在那处并非很客观,一些关于数据库的迁移,比如新扩大表,字段,校订字段类型等等,不应当和最上层的Web项目所波及,数据的搬迁文件放到这里也倍感有个别多余,有一些乱乱的认为,所以才想着单独出来由特别的品种进展管理会相比较好,也正如明晰!

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

本文版权归天涯论坛和笔者李强同盟持有,迎接转发,转发和爬虫请注脚今日头条蜗牛原著地址 http://www.cnblogs.com/tdws/p/5874212.html。  

0、中期希图

a卡塔 尔(英语:State of Qatar)、表实体定义,那几个是在.NET
斯坦dard 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卡塔 尔(英语:State of Qatar)、新建一个.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中您不能够这么做。

1、难点聚集

首先要保管仓库储存类库中早就引进以下七个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同一目录下的Design提姆eDbContextFactory文件,然后实现接口中的方法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中,你的内外文类中是这么的,在构造方法中绝非别的参数。

2、小规模试制迁移命令

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

dotnet ef database update

图片 7

透过VS的SQL
Server财富微电脑查看生成数据库的组织,当中__EFMigrationsHistory为每一次迁移的记录表

图片 8

b卡塔 尔(英语:State of Qatar)、因为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的迁徙而单独维护二个剩余的数据库连接配置。改变也很简短,即因此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卡塔尔国、最终一步,自个儿出手试试看:成立一个SeedData迁移文件来加多数据库的发端数据。:卡塔尔

你创建线程内唯大器晚成的上下文的议程也许是这么的。

4、最后

EF
Core的强大远不仅那些,还也可能有更加多的运用方式等着大家去开掘,去探求。天天提升级中学一年级丢丢,是件很欢悦的事情!

图片 13

回溯了EF6.x以致从前的本子,下边步向本篇分享的正文。韩文官方文书档案地址https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html#

先是本人新建了.NET Core WebApplication,ConsoleApp和多少个.NET
Core类库,如今就先来三个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就能够操作了。

在你实在起首筹划new一个的时候,你发觉必要贰个DbContextOption<AppDbContext>的指标。

图片 26

那大家New三个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地图