依赖项—> 管理NuGet程序包(根据数据库选择安装)
①连接数据库
②完成表和实体的映射
创建.net core API 项目
1.对象实体 映射到 数据库表
!!!两张方式修改表的字段
1.1 创建实体类
[Table("Users")] //第一种 修改表名称
public class Users
{
public int Id {
get; set; }
[Key] //主键
[Required] //第一种 修改字段的非空属性 not null
public string UserName {
get; set; }
[Column("age")] //第一种 修改列名称
[MaxLength(20)] //第一种 修改列最大长度
public int Age {
get; set; }
[Column(TypeName =("varchar(20)"))] //第一种 修改列字段
public string Password {
get; set; }
[NotMapped] //第一种 忽略映射字段
public string FullName {
get; set; }
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //第一种 添加记录时,自动生成值
public DateTime CreateTime{
get; set; }
//[DatabaseGenerated(DatabaseGeneratedOption.None)] //第一种 添加记录时,不允许为null
public DateTime CreateTime{
get; set; }
}
1.2 创建DbContext类
public class EFCoreContextDemo:DbContext
{
//构造方法
public EFCoreContextDemo() {
}
public EFCoreContextDemo(DbContextOptions<EFCoreContextDemo> options)
: base(options)
{
}
//两个实体类
public DbSet<Users> Users {
get; set; }
public DbSet<Departments> Departments {
get; set; }
//重写OnConfiguring方法
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Data Source=127.0.0.1;database=EfCoreDemo;uid=sa;pwd=sa");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//第二种 修改表名
modelBuilder.Entity<Users>().ToTable("User");
//第二种 修改字段的非空属性
modelBuilder.Entity<Users>().Property(b => b.UserName).IsRequired();
//第二种 忽略字段映射
modelBuilder.Entity<Users>().Ignore(b=>b.FullName);
//第二种 设置字段的长度 最大长度
modelBuilder.Entity<Users>().Property(b => b.Password).HasColumnType("varchar(30)").HasMaxLength(10);
//第二种 声明字段 新建记录时,自动添加值
//modelBuilder.Entity<Users>().Property(b => b.CreateTime).ValueGeneratedOnAdd();
modelBuilder.Entity<Users>().Property(b => b.CreateTime).HasDefaultValueSql("getdate()");
//更新FullName,SortName时,UserName自动变化
modelBuilder.Entity<Users>().Property(b => b.UserName).HasComputedColumnSql("[FullName]" + '.' + "[SortName]");
//添加值是 不允许为Null
modelBuilder.Entity<Users>().Property(b => b.Age).ValueGeneratedNever();
}
}
第二种方式 优先级 大于第一种
1.2 工具–>NuGet包管理器–>程序包管理控制台
执行命令 Add-Migration
Name: init1-->(输入日志名)
Build started...
Build succeeded.//日志迁移到数据库里
To undo this action, use Remove-Migration.
执行命令 Update-Database
Build started...
Build succeeded.//创建表成功
Applying migration '20210112134053_init1'.
Done.
2.数据库表 映射到 对象实体
2.1 先到数据库创建表
2.2 执行命令 自动生成实体类
Scaffold-DbContext “Data Source=127.0.0.1;database=数据库名;uid=sa;pwd=sa” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities
说明"数据库连接串 功能组件 文件输出到那个目录下"
注意:执行时看清 控制台的默认项目;设置项目为启动项
Scaffold-DbContext "Data Source=127.0.0.1;database=CompanyManger;uid=sa;pwd=sa" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities
-OutputDir //指定用于输出的目录,如果省略则使用顶级项目目录。
-Context //指定生成的DbContext类的名称。
-Tables //指定要为其生成类的表。
-Force //强制脚手架覆盖现有文件,否则只在没有输出的文件被覆盖的情况下,代码才会继续。更新表
//第一次生成实体类
Scaffold-DbContext "Data Source=127.0.0.1;database=CompanyManger;uid=sa;pwd=sa" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
//第二次生成实体类
Scaffold-DbContext "Data Source=127.0.0.1;database=CompanyManger;uid=sa;pwd=sa" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force
2.3 自动生成Dbcontext类(CRUD方法)
Controller文件夹 右击 添加控制器
startup类
public void ConfigureServices(IServiceCollection services)
{
//添加上下文类
services.AddScoped<EFCoreContextDemo>();
services.AddControllers();
}
启动项目 访问数据
如数据库中的表没有主键,则到实体类中的[Key]标识的字段为主键
//实体类的字段 标识为主键
[Key]
public string UserName {
get; set; }
//检索方法则通过id查找无效,通过标识Key的字段查找
public async Task<ActionResult<Users>> GetUsers(int id)
{
//var users = await _context.Users.FindAsync(id);
var users = await _context.Users.FindAsync("Taro");//实体主键为UserName
if (users == null)
{
return NotFound();
}
return users;
}
阴影属性
影子属性是未在 .NET 实体类中定义的,但在 EF Core 模型中为该实体类型定义的属性。
这些属性的值和状态纯粹在更改跟踪器中进行维护。 当数据库中的数据不应在映射的实体类型上公开时,阴影属性非常有用。
//外键阴影属性
//1. 影子属性最常用于外键属性,其中两个实体之间的关系由数据库中的外键值表示
//2. 使用实体之间的导航属性在实体类型上管理关系
//3. 当发现关系但在依赖实体类中找不到外键属性时,EF 会引入一个影子属性
下面的代码列表将导致向 Users 实体引入 DepartmentId 影子属性,数据库中会自动引入DepartmentId字段
public class Departments
{
public int Id {
get; set; }
public string DepartmentName {
get; set; }
public string Address {
get; set; }
public string Remark {
get; set; }
}
public class Users
{
public int Id {
get; set; }
//[Required]
public string UserName {
get; set; }
//[Column("age")]
//[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Age {
get; set; }
//[Column(TypeName =("varchar(20)"))]
public string Password {
get; set; }
//[NotMapped]
public string FullName {
get; set; }
public string SortName {
get; set; }
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreateTime {
get; set; }
//影子属性 生成表时是dapartmentId
public Departments departments {
get; set; }
}
指定外键
Users.DepartmentFkey —>Departments .DepartmentId
public class Users
{
public int Id {
get; set; }
//[Required]
public string UserName {
get; set; }
//[Column("age")]
//[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Age {
get; set; }
//[Column(TypeName =("varchar(20)"))]
public string Password {
get; set; }
//[NotMapped]
public string FullName {
get; set; }
public string SortName {
get; set; }
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreateTime {
get; set; }
//指定外键
public int DepartmentFkey {
get; set; }
[ForeignKey("DepartmentFkey")]
public Departments departments {
get; set; }
}
数据库连接字符串
//startUp
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<EFCoreContextDemo>(option => option.UseSqlServer(Configuration.GetConnectionString("constr")));
services.AddControllers();
}
//appsettings.json
"ConnectionStrings": {
"constr": "Data Source=127.0.0.1;database=EfCoreDemo2;uid=sa;pwd=sa"
},