首页 > 其他分享 >.Net Core EntityFrameCore

.Net Core EntityFrameCore

时间:2023-07-19 22:57:36浏览次数:38  
标签:Core public Role User context Net NULL EntityFrameCore user

目录

引入

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools

DBFirst MsSqlServer

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.9">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.9">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

测试DbFirst

User表

1.创建测试表

USE [DotNetCoreWeb]
GO
/****** Object:  Table [dbo].[User]    Script Date: 2023/7/17 17:45:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NULL,
	[Age] [int] NULL,
	[Sex] [int] NULL,
	[Mobile] [nvarchar](50) NULL,
	[Emali] [nvarchar](50) NULL,
	[Address] [nvarchar](100) NULL,
	[Account] [nvarchar](50) NOT NULL,
	[Password] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)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]
) ON [PRIMARY]
GO

Nuget

1.使用Nuget控制台执行下面代码,需要替换连接字符串


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测试

using EntityFrameCoreWebApp.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.ChangeTracking;

namespace EntityFrameCoreWebApp.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        DotNetCoreWebContext _context;
        public UsersController(DotNetCoreWebContext context)
        {
            _context = context;
        }
        [HttpGet]
        public IActionResult Get()
        {
            User user = _context.Users.First(it => it.Id == 1);
            return new JsonResult(user);
        }

        [HttpGet]
        public IActionResult GetById(int id)
        {
            User user = _context.Users.First(it => it.Id == id);
            return new JsonResult(user);
        }

        [HttpPost]
        public IActionResult Add(User user)
        {
            EntityEntry<User> result = _context.Users.Add(user);
            int ret = _context.SaveChanges();
            return new JsonResult(new { SaveChanges  = ret});
        }
    }
}

CodeFirst MsSqlServer

  1. 先备份
  2. EnsureDeleted 有库则删除
  3. EnsureCreated 创建
_context.Database.EnsureDeleted(); //删除
_context.Database.EnsureCreated(); //创建

保存原始数据并重新创建库

备份数据

public async Task<IActionResult> BackUpData()
{
    List<Role> roles = _context.Roles.ToList();
    string basepath = AppContext.BaseDirectory;
    XmlSerializer serializer = new XmlSerializer(typeof(List<Role>));

    using (FileStream fs = FileEx.Create(basepath + "Role.xml"))
    {
        serializer.Serialize(fs, roles);
    }

    await Task.CompletedTask;
    return new JsonResult(new { state = true});
}

在OnModelCreating增加

public void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
    string backUpPath = AppContext.BaseDirectory + "Role.xml";
    if (File.Exists(backUpPath))
    {
        using (StreamReader sr = File.OpenText(backUpPath))
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Role>));
            List<Role>? roles = (List<Role>?)xmlSerializer.Deserialize(sr);
            if (roles != null && roles.Any()) 
            {
                modelBuilder.Entity<Role>().HasData(roles);
            }
        }
    }
}

执行codefirst

_context.Database.EnsureDeleted();
_context.Database.EnsureCreated();

迁移命令

  • 类似于Git提交记录
    1. 生成迁移文件add-migration 迁移文件名称 , 执行完会生成对应的 Migrations 文件夹
    • add-migration db01
    1. 更新或还原迁移文件到数据库update-database 迁移文件名称
    • update-databse db01

打印日志

  • 使用 UseLoggerFactory()方法
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    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()));
}

状态

  1. Detached 未关联
  2. Unchanged 有关联,但没有操作
  3. Deleted 删除
  4. Modified修改
  5. Added 添加
  • 执行删除的时候修改状态为其他状态将会执行对应的状态 例:
    • 下方代码并不会删除而是执行修改操作
User user = await dbContext.Users.FirstAsync(it => it.Name == "周杰伦");
dbContext.Users.Remove(user);
dbContext.Entry(user).State = EntityState.Modified;
user.Name = "刘德华";
dbContext.SaveChanges();

导航属性

  1. 有级联关系的可以创建导航属性 如: User 和 Roel 用 RoleId 作为外键Id
  2. 在User类中增加 public virtual Role Role { get; set; } = null!; 为导航属性
  3. 在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 注入 如:
ILazyLoader loader;
public User(ILazyLoader loader)
{
    this.loader = loader;
}
private Role _Role;
    public virtual Role Role
    {
        get
        {
            return loader!.Load(this, ref _Role!)!;
        }
        set
        {
            _Role = value;
        }
    }

设置查询状态不跟踪

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

全局设置

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

局部设置

dbContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

执行时设置

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

标签:Core,public,Role,User,context,Net,NULL,EntityFrameCore,user
From: https://www.cnblogs.com/qfccc/p/17566770.html

相关文章

  • Transformer取代者登场!微软、清华刚推出RetNet:成本低、速度快、性能强
    前言 Transformer的训练并行性是以低效推理为代价的:每一步的复杂度为O(N)且键值缓存受内存限制,让Transformer不适合部署。不断增长的序列长度会增加GPU内存消耗和延迟,并降低推理速度。研究者们一直在努力开发下一代架构,希望保留训练并行性和Transformer的性能,同时实现......
  • 错误连接数据库 [mysql] : org.pentaho.di.core.exception.KettleDatabaseExcepti
    错误连接数据库[mysql]:org.pentaho.di.core.exception.KettleDatabaseException是一种常见的错误,通常在使用PentahoDataIntegration(PDI)工具连接到MySQL数据库时出现。本文将介绍这个错误的原因,以及如何解决它。在使用PDI工具连接到MySQL数据库时,经常会遇到数据库连接失败的......
  • .NET 内存泄漏分析
    目的相信很多小伙伴,除了编码以外,还经常需要和服务器打交道,处理服务器警报,这些警报中最常见的问题之一就是内存泄漏,大部分时候这个问题很难通过传统的日志手段来定位,所以很多的小伙伴遇见了内存泄漏问题常常急的抓耳挠腮,一边百度(现在有了ChatGPT),一边连蒙带猜的尝试,运气好,完美定位,......
  • Visual Studio 2022 Net6.0 无法发现testcase, 也无法执行test case
         解决办法:      <PropertyGroup>                  <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>         <GenerateAssemblyInfo>false</GenerateAssemblyInfo>     ......
  • .net - 支持word上传的富文本编辑器
    ​ 1.编辑器修改(可选)1.1在 ueditor/config.json 中添加代码块    /* 上传word配置 */    "wordActionName":"wordupload",/* 执行上传视频的action名称 */    "wordFieldName":"upfile",/* 提交的视频表单名称 */    "wordPathFormat":"/p......
  • 【netstat】 netstat 查看端口的指令
    先来看两个netstat-natp:-n:以数字形式显示IP地址和端口号,而不进行反向解析。-a:显示所有的连接和监听端口,包括TCP和UDP。-t:仅显示TCP协议的连接。-p:显示与连接关联的进程信息。因此,netstat-natp命令将以数字形式显示所有的TCP和UDP连接,并显示与这些连接关联的进程信息。n......
  • Android GO 版本源码中preferred network type显示
    AndroidGO版本源码中preferrednetworktype的显示作为一名经验丰富的开发者,我将向你解释如何在AndroidGO版本的源码中实现"preferrednetworktype"的显示。下面是实现这个功能的步骤:步骤概览步骤动作步骤1创建一个新的Android项目步骤2添加必要的权限步骤......
  • ADO.NET WINFROM
    ADO.NETWinFormsIntroductionADO.NETisapowerfultechnologyin.NETframeworkforaccessingandmanipulatingdatafromdifferentdatasources.Itprovidesasetofclassesandcomponentsthatallowdeveloperstoconnecttodatabases,executeSQLquerie......
  • 使用MASA Stack+.Net 从零开始搭建IoT平台 第四章 4.4 查询历史数据
    @目录前言分析方案编写代码定义数据类编写查询方法添加ECharts图表效果总结前言IoT平台需要监控设备的运行状态,统计和分析设备传感器数据,使用图表展示是比较常见的场景。使用图表和表格数据组合的Dashboard也可以放在首页作为大屏展示。分析因为我们设备上报的数据都是存储......
  • .Net 对RSA加密结果跟JAVA加密结果不一致问题处理
    stringpublicRsaKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6UCsvO/M/Q51ydlxvuvwy8W9yXkAWLLiG5eA2Duha9cr/XoWrQcETf7PRMNYaQs616PGhj0tnPfxfDltmeqTJQf8rHNxevIZ9nQ0N0/8PIlVszubpMyAHnEis2OLMnLENGyepAlabFGDMDPzRpf0ibL0Q/R15BuTzII5gunzAbwIDAQAB";stri......