项目数据库的设计—EF Core技术运用

一、数据访问技术EF Core包的引用(还原NuGet包)

1. EF Core认识

Entity Framework(EF)Core是Entity Framework的一个轻量级和可扩展的版本,简称EF Core。
EF Core是一个ORM框架,它使得开发人员可以直接使
用.NET对象来操作数据库,减少了大部分的数据访问代码,开发者通常只需要编写对象即可。EF Core支持多种数据库引擎,例如:
Microsoft Sql Server、Sqlite、Mysql、Npgsql等。
什么是ORM,就是对象关系映射,即实体与表之间的相互转换

2. EF Core相关包的引用

添加EF Core和EF Core Tool,采用Nuget包,有两种方式:命令行、NuGet包管理器。
(1)命令行
工具——NuGet包管理器——程序包管理器控制台,输入以下命令
注意:采用这种方式注意选择默认项目,即安装到哪个项目下
在这里插入图片描述
Install-Package Microsoft.EntityFrameworkCore.SqlServer
此项目安装的是支持SQL Server的EF Core,项目采用的数据库为sql server。
再安装EF Core Tool,用于执行程序包管理器控制台中的相关命令。
Install-Package Microsoft.EntityFrameworkCore.Tools
(2)NuGet包管理器
右击项目——管理NuGet程序包,打开NuGet包管理器,进行包的查询和安装。
EF Core包的安装,输入查询Microsoft.EntityFrameworkCore.SqlServer,在右侧版本那里选择最新稳定版本,单击【安装】,安装过了,【安装】按钮就会变为【卸载】按钮。
在这里插入图片描述
查询安装Microsoft.EntityFrameworkCore.Tools,在右侧版本那里选择最新稳定版本,单击【安装】,安装过了,【安装】按钮就会变为【卸载】按钮
在这里插入图片描述
注意:通过这种方式安装时会弹出些提示,单击【确定】和【我接受】即可。
提醒:如果相应的NuGet包没有安装过,查询时上面应该选择到【浏览】。
说明:EF Core是通过一个模型进行数据访问的。模型是由实体类和表示与数据库中的会话组成。
可以用现有的数据库生成模型,也可以手工编写模型来匹配数据库,或者用EF迁移来完成从模型生成数据库。也就是DataFirst和CodeFirst。

二、EF Core Code First方式设计数据库

1. 在Models文件夹下创建一个实体类Result

属性上打上特性标签[Required]等,需要导入using System.ComponentModel.DataAnnotations等;

3. public class Result
    {
        [Key]  [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] // 主键自增id 此条语句可以不要的
        public int Id { get; set; }
        [Required]
        [MaxLength(10)]
        [Display(Name = "姓名")]
        public string StuName { get; set; } 
[Required]
        [MaxLength(100)]
        [Display(Name = "标题")]
        public string Title { get; set; }
        [Required]
        [Display(Name = "成果概述")]
        public string Discription { get; set; }
        [Display(Name = "创建时间")]
        public DateTime Create { get; set; }
    }

上面实体类中的Id将会被EF Core自动识别为主键,且为自增的。

2. 创建EF Core上下文类

创建一个上下文类ResultContext,继承自DbContext,即为上下文的基类,自动就会有基类下的一些方法属性可用哦,需要导入using Microsoft.EntityFrameworkCore;

  public class ResultContext:DbContext
{
//灰色底纹代码先不写,即是默认有无参数的构造方法
        public ResultContext(DbContextOptions<ResultContext> options) : base(options)
        {

        }
        public DbSet<Result> Results { get; set; }
//有多少个表/实体就需要定义多少个属性(一般用复数表示,这个也是后续生成的表名称),返回值为DbSet<实体类型>类型。

}
3、在StartUp.cs文件中注入服务(上下文类)
//后续要注入自己的服务通过在这个方法里面注入
        public void ConfigureServices(IServiceCollection services)
        {
            //设置连接数据库字符串
            var connection = @"server=.;Database=ResultDB;UId=sa;PWD=123456;";
            //注入上下文类,告知上下文ResultContext去与哪个数据库想关联
            services.AddDbContext<ResultContext>(options =>
            {
                options.UseSqlServer(connection);
            });
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

注意:第2步中的构造函数必须是带有DbContextOptions类型参数的,否则会报如下错误:(当然后面的调用基类(base(options))的一个参数的构造方法可以没有)
System.ArgumentException:“AddDbContext was called with configuration, but the context type ‘ResultContext’ only declares a parameterless constructor. This means that the configuration passed to AddDbContext will never be used. If configuration is passed to AddDbContext, then ‘ResultContext’ should declare a constructor that accepts a DbContextOptions<‘ResultContext’ > and must pass it to the base constructor for DbContext.”
原因就是:
因为注入ResultContext服务后,用到该类实例的时候还是会去调用该类的构造方法去实例化对象,注入服务的时候要传递一个action,如何去连数据库的Action,所以构造函数必须是具有参数的构造函数,这种注入方式也叫通过需要传参的构造函数的类的注入。
提问:服务注入的方式还有哪两种:
(1)最常用的注入方式,以接口形式暴露服务
services.AddScoped( typeof(IUserService), typeof(UserService));
services.AddScoped<IUserService, UserService>();
(2)自己注入自己,以实现形式暴露服务
services.AddScoped< UserService>();
services.AddScoped( typeof( UserService));

4、根据上面的实体类和上下文类生成数据库——通过EF的迁移来从模型生成数据库

第一种生成数据库方法:
VS菜单【工具】——NuGet包管理器——程序包管理控制台。输入如下命令:
Add-Migration ResultFirst
说明:Add-Migration为迁移数据命令,ResultFirst 为提供的迁移名称,执行后会在项目根目录下会生成Migrations文件夹,文件夹下会生成相关的类(通过这些类代码生成数据库)。
Update-Database 执行该命令,生成数据库
在这里插入图片描述
注意:执行上面命令时注意上面红色框住的默认项目为当前的项目,且当前项目要设置为启动项。
执行完后出现Done.等表示成功。
打开数据库去查看下:数据库创建成功。
在这里插入图片描述
第二种生成数据库方法——使用dotnet ef命令
右击项目ResultUploadSystem,选择编辑项目文件,打开ResultUploadSystem.csproj文件编辑,添加如下:

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

编辑完后保存,会自动还原NuGet包。
接着在项目ResultUploadSystem文件夹下打开命令提示符,输入dotnet ef命令执行即可。
Dotnet ef migrations add ResultSecond
Dotnet ef database update
在这里插入图片描述
执行完上面代码后,即同样生成数据库。
思考:上面有关数据库的链接信息如何改为采用配置文件,如何读取配置文件(有2种方式:一是弱类型、二是强类型:即创建映射类【相关代码不适合自己写在startup文件中】)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值