EF Core框架学习

依赖项—> 管理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"
  },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值