转发和爬虫请注脚新浪蜗牛原版的书文地址 ,Core的Web项目中展开的

前言

设若大家刚使用EntityFramework
Core作为OXC60M框架的话,想必都会碰到数据库迁移的片段主题材料。

胚胎小编是在ASP.NET
Core的Web项目中张开的,但后来发觉位于这里并不是很客观,一些有关数据库的迁移,比方新扩展表,字段,修改字段类型等等,不应该和最上层的Web项目所提到,数据的动迁文件放到这里也以为到有一点点多余,有一点乱乱的认为,所以才想着单独出来由特意的类别张开管理会比较好,也相比较清楚!

留神目标框架选取的是.NET Core 二.0而不是.NET
Standard 2.0。

正文版权归知乎和笔者李强共同具备,接待转发,转发和爬虫请申明天涯论坛蜗牛原版的书文地址 http://www.cnblogs.com/tdws/p/5874212.html。  

0、早先时代筹划

a)、表实体定义,这几个是在.NET
Standard 二.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)、新建三个.NET Core
二.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的格局。你以前用的EF陆.x,借使在测试代码中您能够直接new出来,在职业的体系支出中,你决定上下文线程内唯临时,也足以new3个目的。但是!在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

皇冠现金app 1

荒唐提醒:

  未找到与命令“dotnet-ef”相称的可推行文件

斩草除根措施:

  在项目文件Light.Repository.csproj中增多以下节点

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

再一次实施上边的授命,假使出现了EF
Core的标记(一只蓄势待发的野马)表示曾经成功

皇冠现金app 2

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

dotnet ef migrations add InitLightDB

皇冠现金app 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步骤的一声令下,报错消息如下:

皇冠现金app 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>试试

化解措施:

  制造3个与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);
        }
    }

 再次实行迁移命令,终于不负众望了。

皇冠现金app 5

中标唤醒:

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

同时类库上边会生成Migrations文件夹以及有关的迁移文件

皇冠现金app 6

在EF六.x中,你的内外文类中是如此的,在构造方法中并未有其他参数。

2、小规模试制迁移命令

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

dotnet ef database update

皇冠现金app 7

经过VS的SQL
Server能源管理器查看生成数据库的组织,当中__EFMigrationsHistory为每一回迁移的记录表

皇冠现金app 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);
            });
        }

然后同样接纳方面的两条命令重新迁移并革新数据库结构

皇冠现金app 9

入眼数据库表结构已经更新

皇冠现金app 10

 同理增多字段,删除字段都以一致的迁徙操作,依然很有利的

皇冠现金app 11

3、扩展

a)、为了便利演示,其实上边在类库中执行迁移时的数据库连接字符串是写死的,那么最棒的艺术是应当去读取Web项目下一度安插好的连日,那样就能够担保上下的1致性,不用再去为了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来讲还并没有达到可以调动数据库生成字段的逐条,可是大家还是能修改迁移文件的实业性质的次第来达到大家想要的功效。上边是本人调动过后重新生成的表,是否看出来和下面的有何样两样,一图胜万语:

皇冠现金app 12

 c)、最终一步,本身入手试试看:创设二个SeedData迁移文件来增多数据库的上马数据。:)

你创建线程内唯1的上下文的法子或者是那般的。

4、最后

EF
Core的强大远不仅那一个,还有更加多的利用情势等着大家去发掘,去切磋。每日进步一丝丝,是件很开心的作业!

皇冠现金app 13

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

第二自身新建了.NET Core WebApplication,ConsoleApp和几个.NET
Core类库,近来就先来2个BLL,DAL四个类库吧。

皇冠现金app 14

焚薮而田方案如下:

皇冠现金app 15

 在类库和ConsoleApp和WebApi中都从nuget上设置好EF
Core.SqlServer和design。你能够透过nuget可视化管理也得以透过nuget调整台命令。命令如下:

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

皇冠现金app 16

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

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

皇冠现金app 17

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

 

 

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

皇冠现金app 18皇冠现金app 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

道理当然是那样的一贯实践这段,你早晚上的集会境遇3个类似上边包车型大巴荒唐。由于您的起步项目是Web,最近你还不曾做项目应当有所的引用,所以它报告您找不到DAL.dll。

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

皇冠现金app 20

皇冠现金app 21

皇冠现金app 22

 

中标未来你会开采DAL层中多了叁个Model文件夹,并且将您的数据库表映射出实体类,其它还有DbContext类。

皇冠现金app 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;");
        }

皇冠现金app,修改后是那样的:

        //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;"

进行如下增添代码,看起来和EF陆.x莫不相异。唯①的分别就在于DbContext对象,通过.NET
Core框架自动为我们做构造函数正视注入IOC。

皇冠现金app 24

皇冠现金app 25

到此大家在Web/WebApi中操作dbContext成功。那么只要您要在Dal层操作,怎么做?这一个_dbContext未有了依附注入,什么人来给我们对象?自身new3个,但是咱们的构造函数摆在这里,不是单纯的New就足以操作了。

在你真的开首希图new二个的时候,你意识供给二个DbContextOption<AppDbContext>的对象。

皇冠现金app 26

那大家New一个DbContextOption<T>对象呢。你见到重载必要这一个参数。

皇冠现金app 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中调用,增添成功

皇冠现金app 28

 

要是本身的一定量分享,对你有一些滴支持,迎接点赞,也为您自身的拿走点赞。

天长日久分享,迎接点击下方关切。祝我们中秋欢喜!

夜间喝个水牛又喝点茶,一贯到凌晨伍点钟也不困…腰疼。,有个硕士朋友平时和自己说,你见过凌晨三点的纽伦堡呢?以往睡1觉,醒来去问问她见没见过凌晨伍点的Charlotte。

最终自个儿有个难题,EF Core最近支撑Code First吗? 没看到相关文书档案。

EF
Core怎样保证上下文线程内唯一?未有CallContext…,也不能用HttpContext.Current.Item,有人
操作过吗?

 

相关文章