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"
  },

猜你喜欢

转载自blog.csdn.net/asdasd1fdsyrt/article/details/112501693