一、数据访问技术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)]
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; }
}
3、在StartUp.cs文件中注入服务(上下文类)
public void ConfigureServices(IServiceCollection services)
{
var connection = @"server=.;Database=ResultDB;UId=sa;PWD=123456;";
services.AddDbContext<ResultContext>(options =>
{
options.UseSqlServer(connection);
});
services.Configure<CookiePolicyOptions>(options =>
{
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文件中】)
|