澳门新葡亰官网当.NET Core类库中使EF Core迁移数据库及SQL Server

澳门新葡亰官网当.NET Core类库中使EF Core迁移数据库及SQL Server

前言

要是大家刚刚使用EntityFramework
Core作为ORM框架的话,想必都见面遇见数据库迁移的一部分题目。

胚胎我是当ASP.NET
Core的Web项目蒙进行的,但新兴察觉在这里并无是大客观,一些有关数据库的迁移,比如新增表,字段,修改字段类型等等,不应当跟极其上层的Web项目所关联,数据的迁文件放到这里吧觉得有些多余,有硌乱乱之感觉到,所以才想在单身出来由特别的型进展管理会比较好,也较清楚!

注意目标框架选择的是.NET Core 2.0假设不是.NET
Standard 2.0。

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)、新建一个.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; }
    }

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同一目录下之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

2、小试迁移命令

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

 同理添加字段,删除字段都是平等的动迁操作,还是生有益于的

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来说还从未直达可以调动数据库生成字段的次第,不过我们要得修改迁移文件的实业性之相继来齐我们怀念如果的效应。下面是自我调之后再次转的申,是休是看下与方的出啊两样,一贪图胜万语:

澳门新葡亰官网 11

 c)、最后一步,自己动手试试看:创建一个SeedData迁移文件来补偿加数据库的起来数据。:)

4、最后

EF
Core的强大远不止这些,还有再多之运方法等正在我们去发现,去探讨。每天进步一点点,是起非常欢喜的事务!

admin

网站地图xml地图