翼度科技»论坛 编程开发 .net 查看内容

.Net Core EntityFrameCore

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9

目录

引入



  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
DBFirst MsSqlServer
  1. <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
  2. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">
  3.   <PrivateAssets>all</PrivateAssets>
  4.   <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  5. </PackageReference>
  6. <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" />
  7. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9">
  8.   <PrivateAssets>all</PrivateAssets>
  9.   <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  10. </PackageReference>
复制代码
测试DbFirst

User表

1.创建测试表
  1. USE [DotNetCoreWeb]
  2. GO
  3. /****** Object:  Table [dbo].[User]    Script Date: 2023/7/17 17:45:39 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. CREATE TABLE [dbo].[User](
  9.         [Id] [int] IDENTITY(1,1) NOT NULL,
  10.         [Name] [nvarchar](50) NULL,
  11.         [Age] [int] NULL,
  12.         [Sex] [int] NULL,
  13.         [Mobile] [nvarchar](50) NULL,
  14.         [Emali] [nvarchar](50) NULL,
  15.         [Address] [nvarchar](100) NULL,
  16.         [Account] [nvarchar](50) NOT NULL,
  17.         [Password] [nvarchar](50) NOT NULL,
  18. CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
  19. (
  20.         [Id] ASC
  21. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
  22. ) ON [PRIMARY]
  23. GO
复制代码
Nuget

1.使用Nuget控制台执行下面代码,需要替换连接字符串
  1. Scaffold-DbContext "Data Source=192.168.1.11;Initial Catalog=DotNetCoreWeb;Persist Security Info=True;User ID=sa;Password=a123456789A..;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force
复制代码
测试

1.使用WebApi测试
  1. using EntityFrameCoreWebApp.Models;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.EntityFrameworkCore.ChangeTracking;
  4. namespace EntityFrameCoreWebApp.Controllers
  5. {
  6.     [Route("api/[controller]/[action]")]
  7.     [ApiController]
  8.     public class UsersController : ControllerBase
  9.     {
  10.         DotNetCoreWebContext _context;
  11.         public UsersController(DotNetCoreWebContext context)
  12.         {
  13.             _context = context;
  14.         }
  15.         [HttpGet]
  16.         public IActionResult Get()
  17.         {
  18.             User user = _context.Users.First(it => it.Id == 1);
  19.             return new JsonResult(user);
  20.         }
  21.         [HttpGet]
  22.         public IActionResult GetById(int id)
  23.         {
  24.             User user = _context.Users.First(it => it.Id == id);
  25.             return new JsonResult(user);
  26.         }
  27.         [HttpPost]
  28.         public IActionResult Add(User user)
  29.         {
  30.             EntityEntry<User> result = _context.Users.Add(user);
  31.             int ret = _context.SaveChanges();
  32.             return new JsonResult(new { SaveChanges  = ret});
  33.         }
  34.     }
  35. }
复制代码
CodeFirst MsSqlServer


  • 先备份
  • EnsureDeleted 有库则删除
  • EnsureCreated 创建
  1. _context.Database.EnsureDeleted(); //删除
  2. _context.Database.EnsureCreated(); //创建
复制代码
保存原始数据并重新创建库

备份数据
  1. public async Task<IActionResult> BackUpData()
  2. {
  3.     List<Role> roles = _context.Roles.ToList();
  4.     string basepath = AppContext.BaseDirectory;
  5.     XmlSerializer serializer = new XmlSerializer(typeof(List<Role>));
  6.     using (FileStream fs = FileEx.Create(basepath + "Role.xml"))
  7.     {
  8.         serializer.Serialize(fs, roles);
  9.     }
  10.     await Task.CompletedTask;
  11.     return new JsonResult(new { state = true});
  12. }
复制代码
在OnModelCreating增加
  1. public void OnModelCreatingPartial(ModelBuilder modelBuilder)
  2. {
  3.     string backUpPath = AppContext.BaseDirectory + "Role.xml";
  4.     if (File.Exists(backUpPath))
  5.     {
  6.         using (StreamReader sr = File.OpenText(backUpPath))
  7.         {
  8.             XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Role>));
  9.             List<Role>? roles = (List<Role>?)xmlSerializer.Deserialize(sr);
  10.             if (roles != null && roles.Any())
  11.             {
  12.                 modelBuilder.Entity<Role>().HasData(roles);
  13.             }
  14.         }
  15.     }
  16. }
复制代码
执行codefirst
  1. _context.Database.EnsureDeleted();
  2. _context.Database.EnsureCreated();
复制代码
迁移命令



  • 类似于Git提交记录

    • 生成迁移文件add-migration 迁移文件名称 , 执行完会生成对应的 Migrations 文件夹


    • add-migration db01

    • 更新或还原迁移文件到数据库update-database 迁移文件名称


    • update-databse db01

打印日志



  • 使用 UseLoggerFactory()方法
  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. {
  3.     optionsBuilder.UseSqlServer("Data Source=192.168.1.11;Initial Catalog=DotNetCoreWeb2;Persist Security Info=True;User ID=sa;Password=a123456789A..;TrustServerCertificate=true").UseLoggerFactory(LoggerFactory.Create(configure => configure.AddConsole()));
  4. }
复制代码
状态


  • Detached 未关联
  • Unchanged 有关联,但没有操作
  • Deleted 删除
  • Modified修改
  • Added 添加


  • 执行删除的时候修改状态为其他状态将会执行对应的状态 例:

    • 下方代码并不会删除而是执行修改操作

  1. User user = await dbContext.Users.FirstAsync(it => it.Name == "周杰伦");
  2. dbContext.Users.Remove(user);
  3. dbContext.Entry(user).State = EntityState.Modified;
  4. user.Name = "刘德华";
  5. dbContext.SaveChanges();
复制代码
导航属性


  • 有级联关系的可以创建导航属性 如: User 和 Roel 用 RoleId 作为外键Id
  • 在User类中增加 public virtual Role Role { get; set; } = null!; 为导航属性
  • 在Role类中增加 public virtual ICollection Users { get; set; } = new List(); 为引用属性
贪婪加载

使用Include 可以将关联Role表的User数据全部加载出来
Role role = await dbContext.Roles.Include(it => it.Users).FirstAsync(it => it.Id == 7);
懒加载

第一种方式


  • 引入
  • 在生成的Context.cs => OnConfiguring(DbContextOptionsBuilder optionsBuilder) 中添加 optionsBuilder.UseLazyLoadingProxies() 这样查询的时候不会加载Role数据, 当需要的时候才会加载
第二种方式


  • 在实体类中的构造函数使用 ILazyLoader loader 注入 如:
  1. ILazyLoader loader;
  2. public User(ILazyLoader loader)
  3. {
  4.     this.loader = loader;
  5. }
  6. private Role _Role;
  7.     public virtual Role Role
  8.     {
  9.         get
  10.         {
  11.             return loader!.Load(this, ref _Role!)!;
  12.         }
  13.         set
  14.         {
  15.             _Role = value;
  16.         }
  17.     }
复制代码
设置查询状态不跟踪



  • 有些时候不需要对查询的数据进行增删改, 所以去掉状态跟踪提升性能
全局设置



  • 在生成的Context.cs的构造函数中添加
    this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
局部设置

dbContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
执行时设置

await dbContext.Roles.AsNoTracking().FirstAsync(it => it.Id == 7);

来源:https://www.cnblogs.com/qfccc/archive/2023/07/19/17566770.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具