.NET-EFCore基礎知識

.NET EF Core(Entity Framework Core)是微軟開發的一款開源的對象關系映射(ORM)框架,用于在.NET 應用程序中與數據庫進行交互。以下是一些.NET EF Core 的基礎知識:

1. 什么是 EF Core

EF Core 是.NET 平臺下的一個數據訪問技術,它允許開發者使用.NET 對象來表示數據庫中的數據,并通過對象的操作來實現對數據庫的增刪改查等操作,無需編寫大量的 SQL 語句。

2. 核心概念

  • DbContext:是 EF Core 中的核心類,它表示與數據庫的會話,用于管理實體對象的生命周期、跟蹤對象的變化以及與數據庫進行交互。例如,通過DbContext可以查詢數據庫中的數據、將新對象插入到數據庫、更新或刪除現有對象等。
  • 實體類:是用于表示數據庫表中數據的.NET 類。每個實體類的實例對應數據庫表中的一行數據,實體類的屬性對應表中的列。例如,可以創建一個User實體類來表示數據庫中的User表,其中User類的Id屬性對應User表中的Id列。
  • DbSet:是DbContext中的屬性,用于表示數據庫中的表。它提供了對實體類集合的操作,例如查詢、添加、刪除實體等。例如,在DbContext中定義DbSet<User>,就可以通過它來操作User實體對應的數據庫表。

3. 安裝與配置

  • 安裝:可以通過 NuGet 包管理器安裝 EF Core 相關的包。例如,要使用 SQL Server 數據庫,需要安裝Microsoft.EntityFrameworkCore.SqlServer包。
  • 配置:在Startup.cs文件的ConfigureServices方法中,需要配置DbContext。例如,對于 SQL Server 數據庫,可以使用以下代碼配置:

csharp

services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

這里ApplicationDbContext是自定義的DbContext類,DefaultConnection是在配置文件中定義的數據庫連接字符串。

4. 數據遷移

EF Core 的數據遷移功能允許開發者在不丟失數據的情況下對數據庫架構進行更改。例如,當實體類的屬性發生變化時,可以通過數據遷移來更新數據庫表的結構。可以使用命令行工具dotnet ef migrations add <MigrationName>來添加一個新的遷移,然后使用dotnet ef database update來將遷移應用到數據庫。

5. 查詢數據

可以使用DbSetQuery方法來查詢數據。例如,要查詢所有的User實體,可以使用以下代碼:

csharp

using (var context = new ApplicationDbContext())
{var users = context.Users.ToList();
}

還可以使用 LINQ 語句對查詢進行過濾、排序等操作。例如,查詢年齡大于 18 歲的用戶:

csharp

using (var context = new ApplicationDbContext())
{var users = context.Users.Where(u => u.Age > 18).ToList();
}

6. 插入、更新和刪除數據

  • 插入數據:創建一個實體類的實例,然后使用DbSetAdd方法將其添加到DbContext中,最后調用SaveChanges方法將數據保存到數據庫。例如:

csharp

using (var context = new ApplicationDbContext())
{var user = new User { Name = "John Doe", Age = 25 };context.Users.Add(user);context.SaveChanges();
}
  • 更新數據:先從數據庫中獲取要更新的實體對象,然后修改其屬性值,最后調用SaveChanges方法保存更改。例如:

csharp

using (var context = new ApplicationDbContext())
{var user = context.Users.FirstOrDefault(u => u.Id == 1);if (user!= null){user.Name = "Jane Doe";context.SaveChanges();}
}
  • 刪除數據:從數據庫中獲取要刪除的實體對象,然后使用DbSetRemove方法將其從DbContext中移除,最后調用SaveChanges方法。例如:

csharp

using (var context = new ApplicationDbContext())
{var user = context.Users.FirstOrDefault(u => u.Id == 1);if (user!= null){context.Users.Remove(user);context.SaveChanges();}
}

7. 關系映射

EF Core 支持實體之間的關系映射,如一對一、一對多、多對多關系。例如,一個User可以有多個Order,這是一對多關系。可以通過在實體類中定義導航屬性來表示這種關系。例如,在User類中定義ICollection<Order>類型的屬性來表示用戶的訂單集合,在Order類中定義User類型的屬性來表示訂單所屬的用戶。

8.基礎操作類

9.通用EF的Service類和IService

using IService;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;namespace IService
{public interface IBaseService{#region--偽代碼//public void Add();//public void Delete();//public void Update();//public void Query();#endregion#region Query/// <summary>/// 主鍵查詢/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>public T Find<T>(int id) where T : class;/// <summary>/// 不應該暴露給上端使用者,盡量少用/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>//[Obsolete("盡量避免使用,using 帶表達式目錄樹的代替")]public IQueryable<T> Set<T>() where T : class;/// <summary>/// 這才是合理的做法,上端給條件,這里查詢/// </summary>/// <typeparam name="T"></typeparam>/// <param name="funcWhere"></param>/// <returns></returns>public IQueryable<T> Query<T>(Expression<Func<T, bool>> funcWhere) where T : class;/// <summary>/// 分頁查詢/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="S"></typeparam>/// <param name="funcWhere"></param>/// <param name="pageSize"></param>/// <param name="pageIndex"></param>/// <param name="funcOrderby"></param>/// <param name="isAsc"></param>/// <returns></returns>public PagingData<T> QueryPage<T, S>(Expression<Func<T, bool>> funcWhere, int pageSize, int pageIndex, Expression<Func<T, S>> funcOrderby, bool isAsc = true) where T : class;#endregion#region Insert/// <summary>/// 即使保存  不需要再Commit/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>/// <returns></returns>public T Insert<T>(T t) where T : class;/// <summary>/// 新增集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="tList"></param>/// <returns></returns>public IEnumerable<T> Insert<T>(IEnumerable<T> tList) where T : class;#endregion#region Update/// <summary>/// 是沒有實現查詢,直接更新的,需要Attach和State/// /// 如果是已經在context,只能再封裝一個(在具體的service)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Update<T>(T t) where T : class;/// <summary>/// 修改一個集合/// </summary>/// <typeparam name="T"></typeparam>/// <param name="tList"></param>public void Update<T>(IEnumerable<T> tList) where T : class;#endregion#region Delete/// <summary>/// 先附加 再刪除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Delete<T>(T t) where T : class;/// <summary>/// 還可以增加非即時commit版本的,/// 做成protected/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Id"></param>public void Delete<T>(int Id) where T : class;public void Delete<T>(IEnumerable<T> tList) where T : class;#endregion#region Other/// <summary>/// 執行Sql語句,返回IQueryable/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public IQueryable<T> ExcuteQuery<T>(string sql, SqlParameter[] parameters) where T : class;/// <summary>/// 執行Sql語句,返回實體對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>public void Excute<T>(string sql, SqlParameter[] parameters) where T : class;#endregionList<T> FindEntitiesByProperty<T, TProperty>(System.Linq.Expressions.Expression<System.Func<T, TProperty>> propertySelector, TProperty value) where T : class;}
}----------------------------------------------------------------------------------
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using IService;namespace Service
{public abstract class BaseService : IBaseService{#region--偽代碼//public void Add()//{//    throw new NotImplementedException();//}//public void Delete()//{//    throw new NotImplementedException();//}//public void Query()//{//    throw new NotImplementedException();//}//public void Update()//{//    throw new NotImplementedException();//}#endregionprotected DbContext Context { get; set; }/// <summary>/// 構造函數注入/// </summary>/// <param name="context"></param>public BaseService(DbContext context){Context = context;}#region Query/// <summary>/// 主鍵查詢/// </summary>/// <typeparam name="T"></typeparam>/// <param name="id"></param>/// <returns></returns>public T Find<T>(int id) where T : class{return this.Context.Set<T>().Find(id);}/// <summary>/// 不應該暴露給上端使用者,盡量少用/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>//[Obsolete("盡量避免使用,using 帶表達式目錄樹的代替")]public IQueryable<T> Set<T>() where T : class{return this.Context.Set<T>();}/// <summary>/// 這才是合理的做法,上端給條件,這里查詢/// </summary>/// <typeparam name="T"></typeparam>/// <param name="funcWhere"></param>/// <returns></returns>public IQueryable<T> Query<T>(Expression<Func<T, bool>> funcWhere) where T : class{return this.Context.Set<T>().Where<T>(funcWhere);}/// <summary>/// 分頁查詢/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="S"></typeparam>/// <param name="funcWhere"></param>/// <param name="pageSize"></param>/// <param name="pageIndex"></param>/// <param name="funcOrderby"></param>/// <param name="isAsc"></param>/// <returns></returns>public PagingData<T> QueryPage<T, S>(Expression<Func<T, bool>> funcWhere, int pageSize, int pageIndex, Expression<Func<T, S>> funcOrderby, bool isAsc = true) where T : class{var list = Set<T>();if (funcWhere != null){list = list.Where<T>(funcWhere);}if (isAsc){list = list.OrderBy(funcOrderby);}else{list = list.OrderByDescending(funcOrderby);}PagingData<T> result = new PagingData<T>(){DataList = list.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(),PageIndex = pageIndex,PageSize = pageSize,RecordCount = list.Count()};return result;}#endregion#region Insert/// <summary>/// 即使保存  不需要再Commit/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>/// <returns></returns>public T Insert<T>(T t) where T : class{this.Context.Set<T>().Add(t);this.Commit();//寫在這里  就不需要單獨commit  不寫就需要return t;}public IEnumerable<T> Insert<T>(IEnumerable<T> tList) where T : class{this.Context.Set<T>().AddRange(tList);this.Commit();//一個鏈接  多個sqlreturn tList;}#endregion#region Update/// <summary>/// 是沒有實現查詢,直接更新的,需要Attach和State/// /// 如果是已經在context,只能再封裝一個(在具體的service)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Update<T>(T t) where T : class{if (t == null) throw new Exception("t is null");this.Context.Set<T>().Attach(t);//將數據附加到上下文,支持實體修改和新實體,重置為UnChangedthis.Context.Entry<T>(t).State = EntityState.Modified;this.Commit();//保存 然后重置為UnChanged}public void Update<T>(IEnumerable<T> tList) where T : class{foreach (var t in tList){this.Context.Set<T>().Attach(t);this.Context.Entry<T>(t).State = EntityState.Modified;}this.Commit();}#endregion#region Delete/// <summary>/// 先附加 再刪除/// </summary>/// <typeparam name="T"></typeparam>/// <param name="t"></param>public void Delete<T>(T t) where T : class{if (t == null) throw new Exception("t is null");this.Context.Set<T>().Attach(t);this.Context.Set<T>().Remove(t);this.Commit();}/// <summary>/// 還可以增加非即時commit版本的,/// 做成protected/// </summary>/// <typeparam name="T"></typeparam>/// <param name="Id"></param>public void Delete<T>(int Id) where T : class{T t = this.Find<T>(Id);//也可以附加if (t == null) throw new Exception("t is null");this.Context.Set<T>().Remove(t);this.Commit();}public void Delete<T>(IEnumerable<T> tList) where T : class{foreach (var t in tList){this.Context.Set<T>().Attach(t);}this.Context.Set<T>().RemoveRange(tList);this.Commit();}#endregion#region Otherpublic void Commit(){Context.SaveChanges(); //EFCore中對于增刪改 ,必須要執行這句話才能生效}/// <summary>/// 執行Sql語句,返回IQueryable/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public IQueryable<T> ExcuteQuery<T>(string sql, SqlParameter[] parameters) where T : class{return this.Context.Set<T>().FromSqlRaw(sql, parameters);}/// <summary>/// 執行Sql語句,返回實體對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="parameters"></param>public void Excute<T>(string sql, SqlParameter[] parameters) where T : class{IDbContextTransaction trans = null;try{trans = Context.Database.BeginTransaction();this.Context.Database.ExecuteSqlRaw(sql, parameters);trans.Commit();}catch (Exception){if (trans != null)trans.Rollback();throw;}}/// <summary>/// 釋放回收/// </summary>public virtual void Dispose(){if (Context != null){Context.Dispose();}}#endregionpublic List<T> FindEntitiesByProperty<T, TProperty>(Expression<Func<T, TProperty>> propertySelector, TProperty value) where T : class{var propertyValueEqualExpression = Expression.Equal(propertySelector.Body, Expression.Constant(value));var lambda = Expression.Lambda<Func<T, bool>>(propertyValueEqualExpression, propertySelector.Parameters);return Context.Set<T>().Where(lambda).ToList();}}
}

10.創建表的案例


using DbModels;
using static System.Runtime.InteropServices.JavaScript.JSType;namespace Initial_EFDB
{internal class Program{static void Main(string[] args){string connectionString = "Data Source=WIN-20240630YNV\\SQLEXPRESS;" +"Initial Catalog= EFCoreTestDB;Persist Security Info=True;User ID=sa;" +"Password=lyh2016;Encrypt=True;Trust Server Certificate=True";Console.WriteLine("Hello, World!");using (AgiletyDbContext context = new AgiletyDbContext(connectionString)){//根據數據庫連接字符串的配置刪除數據庫,如果不存在就不操作context.Database.EnsureDeleted();//根據數據庫連接字符串的配置創建數據庫,如果存在就不創建  context.Database.EnsureCreated();var adduser = new DbModels.Models.UserEntity(){Address = "武漢市",Email = "18672554858@163.com",Imageurl = "",LastLoginTime = DateTime.Now,Mobile = "18672554858",Name = "Ricahrd",Password = "123456",QQ = "8542313245",Phone = "15845858858",Sex = 1,UserType = 1,WeChat = ""};context.UserEntities.Add(adduser);context.SaveChanges();查詢//UserEntity user = context.UserEntities.OrderByDescending(c => c.UserId).FirstOrDefault();//user.Name = "Richard 老師";//context.SaveChanges();//context.Remove(user);//context.SaveChanges();}}}
}

11.數據操作案例UserService和IUserService

using ModelDto;namespace IService
{public interface IUserService: IBaseService{/// <summary>/// 登錄功能/// </summary>/// <param name="userName"></param>/// <param name="password"></param>/// <returns></returns>public UserDto? Login(string userName, string password);public void ShowUserAndCompany();public void SetUserAndCompany();}
}-----------------------------------------------------------------------using AutoMapper;
using Microsoft.EntityFrameworkCore;
using DbModels.Models;
using IService;
using ModelDto;
using Service;namespace Zhaoxi.AgiletyFramework.BusinessServices
{public class UserService : BaseService, IUserService{private readonly IMapper _IMapper;public UserService(DbContext context, IMapper iMapper) : base(context){_IMapper = iMapper;}/// <summary>/// 登錄功能/// </summary>/// <param name="userName"></param>/// <param name="password"></param>/// <returns></returns>public UserDto? Login(string userName, string password){string pwd = password;// MD5Encrypt.Encrypt(password);List<UserEntity> userList = Context.Set<UserEntity>().Where(c => c.Name.Equals(userName) && c.Password.Equals(pwd)).ToList();if (userList == null || userList.Count <= 0){return null;}UserEntity user = userList.First();UserDto userDto = _IMapper.Map<UserEntity, UserDto>(user);List<int> roleIdList = Context.Set<UserRoleMapEntity>().Where(c => c.UserId == user.UserId).Select(r => r.RoleId).ToList();userDto.RoleIdList = roleIdList;//設置登錄用戶角色//登錄用戶的菜單idList<Guid> userMenuIds = Context.Set<RoleMenuMapEntity>().Where(c => roleIdList.Contains(c.Id)).Select(c => c.MenuId).ToList();return userDto;}/// <summary>/// Autofac支持額aop擴展,如果通過類的方式來支持Aop,只有定義成Virtual方法,才能夠進入到aop內部去;/// </summary>public virtual void SetUserAndCompany(){}public void ShowUserAndCompany(){ }}
}

12.控制器的應用案例

using AutoMapper;
using DbModels.Models;
using EFTest.Comm;
using IService;
using Microsoft.AspNetCore.Mvc;
using ModelDto;
using Service;namespace EFTest.Controllers
{/// <summary>/// Api控制器,用戶相關的API/// </summary>[Route("api/[controller]/[action]")] // 修改路由前綴,包含控制器名稱和方法名稱[ApiController]public class UserController : ControllerBase{private readonly IUserService _IUserService;private readonly IMapper _IMapper;   //AutoMapper映射使用/// <summary>/// 構造函數/// </summary>/// <param name="iUserService"></param>/// <param name="iMapper"></param>public UserController( IUserService iUserService, IMapper iMapper){_IUserService = iUserService;_IMapper = iMapper;}/// <summary>/// 獲取用戶的分頁列表/// </summary>/// <param name="pageindex"></param>/// <param name="pageSize"></param>/// <param name="searchaString"></param>/// <returns></returns>[HttpGet][Route("{pageindex:int}/{pageSize:int}")][Route("{pageindex:int}/{pageSize:int}/{searchaString}")]public async Task<JsonResult> GetUserPageAsync(int pageindex, int pageSize, string? searchaString = null){PagingData<UserEntity> paging = _IUserService.QueryPage<UserEntity, DateTime>(!string.IsNullOrWhiteSpace(searchaString) ? c => c.Name.Contains(searchaString) : a => true, pageSize, pageindex, c => c.CreateTime, false);PagingData<UserDto> pagingResult = _IMapper.Map<PagingData<UserEntity>, PagingData<UserDto>>(paging);JsonResult result = new JsonResult(new ApiDataResult<PagingData<UserDto>>(){Data = pagingResult,Success = true,Message = "用戶分頁列表"});return await Task.FromResult(result);}/// <summary>/// 新增用戶/// </summary>/// <param name="userDto"></param>/// <returns></returns>[HttpPost]public async Task<JsonResult> AddUserAsync([FromBody] AddUserDto userDto){UserEntity adduser = _IMapper.Map<AddUserDto, UserEntity>(userDto);UserEntity user = _IUserService.Insert(adduser);var result = new JsonResult(new ApiDataResult<UserEntity>() { Data = adduser, Success = true, Message = "添加用戶" });if (user.UserId <= 0){result = new JsonResult(new ApiDataResult<UserEntity>() { Data = adduser, Success = false, Message = "添加用戶失敗" });}return await Task.FromResult(result);}/// <summary>/// 根據名稱查詢用戶列表/// </summary>/// <param name="name">要查詢的用戶名</param>/// <returns>符合條件的用戶列表</returns>[HttpGet]public IActionResult SelectByName(string name){if (string.IsNullOrEmpty(name)){return BadRequest("用戶名不能為空");}var userList = _IUserService.FindEntitiesByProperty<UserEntity, string>(u => u.Name, name);return Ok(userList);}/// <summary>/// 基于 name 對 User 模型進行數據更新/// <param name="updatedUser">更新后的用戶數據</param>/// <returns>返回更新結果信息</returns>[HttpPost]public async Task<IActionResult> UpdateUserByName(UserEntity updatedUser){try{// 根據 name 查詢用戶列表var usersToUpdate = _IUserService.FindEntitiesByProperty<UserEntity, string>(u => u.Name ,updatedUser.Name);if (usersToUpdate == null || usersToUpdate.Count == 0){return NotFound($"沒有找到名為 {updatedUser.Name} 的用戶");}// 更新每個找到的用戶foreach (var user in usersToUpdate){// 這里簡單地將更新后的屬性值賦給原用戶對象,你可以根據實際需求進行更復雜的屬性更新邏輯//user.UserId = updatedUser.UserId;user.Sex = updatedUser.Sex;user.Address = updatedUser.Address;user.Name= updatedUser.Name;_IUserService.Update(user);}return Ok($"成功更新了名為 {updatedUser.Name} 的用戶數據");}catch (Exception ex){return StatusCode(500, $"更新用戶數據時發生錯誤: {ex.Message}");}}/// <summary>/// 基于 name 對 User 模型進行數據刪除/// </summary>/// <param name="name">要刪除的用戶的 name</param>/// <returns>返回刪除結果信息</returns>[HttpDelete("{name}")]public async Task<IActionResult> DeleteUserByName(string name){try{// 根據 name 查詢用戶列表var usersToDelete = _IUserService.FindEntitiesByProperty<UserEntity, string>(u => u.Name, name);if (usersToDelete == null || usersToDelete.Count == 0){return NotFound($"沒有找到名為 {name} 的用戶");}// 刪除每個找到的用戶_IUserService.Delete<UserEntity>(usersToDelete);return Ok($"成功刪除了名為 {name} 的用戶數據");}catch (Exception ex){return StatusCode(500, $"刪除用戶數據時發生錯誤: {ex.Message}");}}/// <summary>/// 查詢 user 表所有數據/// </summary>/// <returns>返回 user 表的所有數據</returns>[HttpGet]public async Task<IActionResult> GetAllUsers(){try{// 調用 IBaseService 的 Query 方法查詢所有 User 數據var users = _IUserService.Query<UserEntity>(u => true).ToList();return Ok(users);}catch (Exception ex){return StatusCode(500, $"查詢用戶數據時發生錯誤: {ex.Message}");}}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901046.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用 RNN 預測股票價格:從數據處理到可視化實戰

在金融領域&#xff0c;預測股票價格走勢一直是眾多投資者和研究者關注的焦點。今天&#xff0c;我們將利用深度學習中的循環神經網絡&#xff08;RNN&#xff09;來構建一個簡單的股票價格預測模型&#xff0c;并詳細介紹從數據加載、預處理、模型搭建、訓練到最終結果可視化的…

LangGraph 架構詳解

核心架構組件 LangGraph 的架構建立在一個靈活的基于圖的系統上&#xff0c;使開發者能夠定義和執行復雜的工作流。以下是主要架構組件&#xff1a; 1. 狀態管理系統 LangGraph 的核心是其強大的狀態管理系統&#xff0c;它允許應用程序在整個執行過程中維護一致的狀態&…

Python 深度學習實戰 第1章 什么是深度學習代碼示例

第1章&#xff1a;什么是深度學習 內容概要 第1章介紹了深度學習的背景、發展歷史及其在人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;中的地位。本章探討了深度學習的定義、其與其他機器學習方法的關系&#xff0c;以及深度學習在近年來取得的成…

swift菜鳥教程1-5(語法,變量,類型,常量,字面量)

一個樸實無華的目錄 今日學習內容&#xff1a;1.基本語法引入空格規范輸入輸出 2.變量聲明變量變量輸出加反斜杠括號 \\( ) 3.可選(Optionals)類型可選類型強制解析可選綁定 4.常量常量聲明常量命名 5.字面量整數 and 浮點數 實例字符串 實例 今日學習內容&#xff1a; 1.基本…

GAT-GRAPH ATTENTION NETWORKS(論文筆記)

CCF等級&#xff1a;A 發布時間&#xff1a;2018年 代碼位置 25年4月21日交 目錄 一、簡介 二、原理 1.注意力系數 2.歸一化 3.特征組合與非線性變換 4.多頭注意力 4.1特征拼接操作 4.2平均池化操作 三、實驗性能 四、結論和未來工作 一、簡介 圖注意力網絡&…

XML、JSON 和 Protocol Buffers (protobuf) 對比

目錄 1. XML (eXtensible Markup Language) 1&#xff09;xml的特點&#xff1a; 2&#xff09;xml的適用場景&#xff1a; 2. JSON (JavaScript Object Notation) 1&#xff09;JSOM的特點&#xff1a; 2&#xff09;JSON的適用場景&#xff1a; 3. Protocol Buffers (…

如何通過簡單步驟保護您的網站安全

在如今的數字化時代&#xff0c;網站安全已經成為每個網站管理者都不能忽視的重點。未授權用戶入侵、數據泄露和惡意軟件等威脅越來越多&#xff0c;網站安全對于保護企業、用戶和客戶的數據非常重要。為了幫助您提升網站的安全性&#xff0c;本文介紹了一些簡單且有效的措施&a…

【后端開發】初識Spring IoC與SpringDI、圖書管理系統

文章目錄 圖書管理系統用戶登錄需求分析接口定義前端頁面代碼服務器代碼 圖書列表展示需求分析接口定義前端頁面部分代碼服務器代碼Controller層service層Dao層modle層 Spring IoC定義傳統程序開發解決方案IoC優勢 Spring DIIoC &DI使用主要注解 Spring IoC詳解bean的存儲五…

通付盾風控智能體(RiskAgent): 神煩狗(DOGE)

在數字化業務高速發展的今天&#xff0c;風控系統已成為企業抵御黑產、欺詐、保障交易安全的核心防線。然而傳統風控面臨人力依賴高與策略滯后性等挑戰&#xff0c;數據分析師需每日從海量數據中手動提煉風險特征、設計防護規則&#xff0c;耗時費力&#xff1b;新策略從發現到…

大模型論文:Language Models are Unsupervised Multitask Learners(GPT2)

大模型論文&#xff1a;Language Models are Unsupervised Multitask Learners(GPT2) 文章地址&#xff1a;https://storage.prod.researchhub.com/uploads/papers/2020/06/01/language-models.pdf 摘要 自然語言處理任務&#xff0c;例如問答、機器翻譯、閱讀理解和摘要&am…

分布式ID生成方案的深度解析與Java實現

在分布式系統中&#xff0c;生成全局唯一的ID是一項核心需求&#xff0c;廣泛應用于訂單編號、用戶信息、日志追蹤等場景。分布式ID不僅需要保證全局唯一性&#xff0c;還要滿足高性能、高可用性以及一定的可讀性要求。本文將深入探討分布式ID的概念、設計要點、常見生成方案&a…

記 etcd 無法在docker-compose.yml啟動后無法映射數據庫目錄的問題

1、將etcd 單獨提取 Dockerfile&#xff0c;指定配置文件和數據目錄 #鏡像 FROM bitnami/etcd:3.5.11 #名稱 ENV name"etcd" #重啟 ENV restart"always" #運行無權限 ENV ALLOW_NONE_AUTHENTICATION"yes" #端口 EXPOSE 2379 2380 #管理員權限才…

怎樣才不算干擾球·棒球1號位

在棒球運動中&#xff0c;"干擾球"&#xff08;Interference&#xff09;是指球員或場外人員非法影響了比賽的正常進行。以下情況通常 不構成干擾&#xff0c;屬于合法行為或無需判罰&#xff1a; 1. 擊跑員&#xff08;Batter-Runner&#xff09;合法跑壘 跑壘限制…

PyTorch實現多輸入輸出通道的卷積操作

本文通過代碼示例詳細講解如何在PyTorch中實現多輸入通道和多輸出通道的卷積運算&#xff0c;并對比傳統卷積與1x1卷積的實現差異。 1. 多輸入通道互相關運算 當輸入包含多個通道時&#xff0c;卷積核需要對每個通道分別進行互相關運算&#xff0c;最后將結果相加。以下是實現…

深入解析 MySQL 中的日期時間函數:DATE_FORMAT 與時間查詢優化、DATE_ADD、CONCAT

深入解析 MySQL 中的日期時間函數&#xff1a;DATE_FORMAT 與時間查詢優化 在數據庫管理和應用開發中&#xff0c;日期和時間的處理是不可或缺的一部分。MySQL 提供了多種日期和時間函數來滿足不同的需求&#xff0c;其中DATE_FORMAT函數以其強大的日期格式化能力&#xff0c;…

SSH配置優化:提升本地內網Linux服務器遠程連接速度與穩定性

文章目錄 引言一. 理解SSH連接過程與影響因素二. 服務器端SSH配置優化三. 客戶端SSH配置優化四. 高級技巧五. 內網穿透突破公網IP限制總結 引言 SSH (Secure Shell) 是一種網絡協議&#xff0c;用于加密的網絡服務&#xff0c;常用于遠程登錄和管理Linux服務器。對于本地內網的…

BERT - MLM 和 NSP

本節代碼將實現BERT模型的兩個主要預訓練任務&#xff1a;掩碼語言模型&#xff08;Masked Language Model, MLM&#xff09; 和 下一句預測&#xff08;Next Sentence Prediction, NSP&#xff09;。 1. create_nsp_dataset 函數 這個函數用于生成NSP任務的數據集。 def cr…

“實時滾動”插件:一個簡單的基于vue.js的無縫滾動

1、參考連接&#xff1a; 安裝 | vue-seamless-scroll 2、使用步驟&#xff1a; 第一步&#xff1a;安裝 yarn add vue-seamless-scroll 第二步&#xff1a;引入 import vueSeamlessScroll from vue-seamless-scroll/src 第三步&#xff1a;注冊 components: { vueSeamless…

【藍橋杯】賽前練習

1. 排序 import os import sysn=int(input()) data=list(map(int,input().split(" "))) data.sort() for d in data:print(d,end=" ") print() for d in data[::-1]:print(d,end=" ")2. 走迷宮BFS import os import sys from collections import…

pyTorch-遷移學習-學習率衰減-四種天氣圖片多分類問題

目錄 1.導包 2.加載數據、拼接訓練、測試數據的文件夾路徑 3.數據預處理 3.1 transforms.Compose數據轉化 3.2分類存儲的圖片數據創建dataloader torchvision.datasets.ImageFolder torch.utils.data.DataLoader 4.加載預訓練好的模型(遷移學習) 4.1固定、修改預訓練…