经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
Net6 EFcore框架介绍
来源:cnblogs  作者:wskxy  时间:2023/3/6 9:15:17  对本文有异议

1、简介

  EFcore,可用使得开发人员不需要再去关注数据库的实现,全都由代码进行生成

  这样有利于减少工作量、数据库快速迁移...

2、上手搭建架构

  

  (这个图是做完本章内容的完整图,我们一步步深入即可)

  在写EF之前,先安装好数据库,我选择在本地安装Sqlserver

 

  我们先执行最核心的两步,将EF和数据库跑通

  1)类&表的定义:基本上会保持class和数据库的table字段保持一致,如上UserModel,我定义了Staff、Tenant两个类,会自动生成两个表

    UserModel需要安装

  1. Microsoft.EntityFrameworkCore.SqlServer

    Staff

  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. namespace UserModel
  4. {
  5. public class Staff
  6. {
  7. public int Id { get; set; }public string Name { get; set; }
  8. public string Description { get; set; }
  9. public string? PhoneNumber { get; set; }
  10. public string? Email { get; set; }
  11. }
  12. }

    Tenant

  1. namespace UserModel
  2. {
  3. public class Tenant
  4. {
  5. public int Id { get; set; }
  6. public string Name { get; set; }
  7. public string Description { get; set; }
  8. }
  9. }

  2)上下文定义:负责关联实体类、访问数据库配置,提供后续生成数据库支持,如上MyDBContextLibrary

  MyDBContextLibrary需要安装

  1. Microsoft.EntityFrameworkCore.Tools

  MyDBContext

  1. using Microsoft.EntityFrameworkCore;
  2. namespace UserModel
  3. {
  4. public class MyDBContext : DbContext
  5. {
  6. public DbSet<Staff> Staffs { get; set; }
  7. public DbSet<Tenant> Tenants { get; set; }
  8. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  9. {
  10. base.OnConfiguring(optionsBuilder);
  11. optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes");
  12. }
  13. }
  14. }

  准备完毕!!

  打开【程序包管理器控制台】

  项目指定到MyDBContext

  

  1. Add-Migration Ini #添加一个迁移 Ini是为这个迁移起的备注名
  2. Update-database #更新到数据库,执行了才会同步迁移到数据库

  到此,简单的EF框架已经跑起来了

3、扩展

  EF是一个十分强大的框架,我们逐渐扩展知识点。

  1)属性定义

  有两种方式

  其一:Data Annotations(数据注解),利用特性进行定义,如对Staff属性进行定义

  1. using System.ComponentModel.DataAnnotations;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. //Data Annotations例子
  4. namespace UserModel
  5. {
  6. [Table("Staff")]//可用加特性指定表名
  7. public class Staff
  8. {
  9. public int Id { get; set; }
  10. [Required]//必填
  11. [MaxLength(10)]//最大长度为10
  12. public string Name { get; set; }
  13. [Required]
  14. public string Description { get; set; }
  15. public string? PhoneNumber { get; set; } //可空
  16. public string? Email { get; set; }
  17. }
  18. }

  PS:提醒一点,Id / 类名+Id  在迁移到数据库表的时候,会默认为递增序列

  其二:Fluent API,微软官方提供的API,如对Tenant属性进行定义

  在MyDBContext,重写OnModelCreating方法

  1. using Microsoft.EntityFrameworkCore;
  2. namespace UserModel
  3. {
  4. public class MyDBContext : DbContext
  5. {
  6. public DbSet<Staff> Staffs { get; set; }
  7. public DbSet<Tenant> Tenants { get; set; }
  8. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  9. {
  10. base.OnConfiguring(optionsBuilder);
  11. optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes");
  12. }
  13. protected override void OnModelCreating(ModelBuilder modelBuilder)
  14. {
  15. base.OnModelCreating(modelBuilder);modelBuilder.Entity<Tenant>().Property(x=>x.Description).IsRequired(false); /*指定Description非必填*/
  16. }
  17. }
  18. }

  当然,我们容易看到,如果实体很多,属性直接写在这里代码太冗长了

  改变一下方法,添加一个TenantConfig类

  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.EntityFrameworkCore.Metadata.Builders;
  3. namespace UserModel
  4. {
  5. public class TenantConfig : IEntityTypeConfiguration<Tenant>
  6. {
  7. public void Configure(EntityTypeBuilder<Tenant> builder)
  8. {
  9. builder.ToTable("Tenant");//可重新指定表名
  10. builder.HasKey(x => x.Id);
  11. builder.Property(x=>x.Name).IsRequired().HasColumnType("nvarchar(100)");
  12. builder.Property(x=>x.Description).IsRequired(false);
  13. }
  14. }
  15. }

  然后  DbContext:

  1. using Microsoft.EntityFrameworkCore;
  2. namespace UserModel
  3. {
  4. public class MyDBContext : DbContext
  5. {
  6. public DbSet<Staff> Staffs { get; set; }
  7. public DbSet<Tenant> Tenants { get; set; }
  8. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  9. {
  10. base.OnConfiguring(optionsBuilder);
  11. optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=master;Integrated Security=True;TrustServerCertificate=yes");
  12. }
  13. protected override void OnModelCreating(ModelBuilder modelBuilder)
  14. {
  15. base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(typeof(Tenant).Assembly); //利用反射,加载Tenant程序集下的IEntityTypeConfiguration
  16. }
  17. }
  18. }

  完成,再次生成一个迁移到数据库看看!!!

  代码不会一步到位的,大家逐步测试严重,这边我就不贴数据库的截图了

4、最后说明一下ConsoleApp

  Program

  1. using UserModel;
  2. using(var ctx = new MyDBContext())
  3. {
  4. var s = new Staff()
  5. {
  6. Name = "kxy2",
  7. Description = "三好员工",
  8. PhoneNumber = "1234567890"
  9. };
  10. ctx.Staffs.Add(s);
  11. var t = new Tenant()
  12. {
  13. Name = "ccc",
  14. };
  15. ctx.Tenants.Add(t);
  16. ctx.SaveChanges();
  17. }
  18. Console.ReadLine();

  测试数据而已,怎么方便怎么来

  PS:有个点,如果设置ConsoleApp为启动项,迁移的时候会验证启动项的依赖,从而产生错误

  ConsoleApp需要安装

  1. Microsoft.EntityFrameworkCore.Design

  至此,完成!!

  感谢关注

  

 

原文链接:https://www.cnblogs.com/wskxy/p/17179491.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号