Core类库中动用EF,你怎么创制

前言

要是我们刚使用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)、表实体定义,那个是在.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; }
    }

现阶段国内各大论坛,各位大腕的分享,是遵照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同一目录下的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中,你的左右文类中是如此的,在构造方法中尚无别的参数。

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

 同理加多字段,删除字段都以同样的迁移操作,依然很有益的

大红鹰葡京会 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地图