EF框架基础应用入门

文章目录

  • 一、介绍
  • 二、EF6框架基础
    • 1. 数据模型和实体类
    • 2. 数据库上下文(DbContext)介绍
    • 3. 配置数据模型与数据库表的映射关系
  • 两种方式Fluent API和数据注解
      • Fluent API
      • 数据注解
    • 4. 数据库迁移(Migration)概述
      • a. 创建初始迁移
      • b. 更新迁移
  • 三、基本数据操作
    • 1. 查询数据
      • a. 基本查询语法
      • b. 条件查询和排序
      • c. 关联查询
    • 2. 插入数据
      • a. 添加单个实体
      • b. 批量添加实体
    • 3. 更新数据
      • a. 修改现有实体
      • b. 批量更新实体
    • 4. 删除数据
      • a. 删除单个实体
      • b. 批量删除实体
  • 四、性能优化
  • 五、错误处理和日志记录
    • 1.异常处理和日志记录
    • 2. EF框架的日志记录配置

一、介绍

  • 什么是Entity Framework(EF)框架

Entity Framework(EF)框架是微软提供的一种对象关系映射(ORM)框架,用于简化与数据库的交互和数据访问操作。它允许开发人员使用面向对象的方式来操作数据库,而无需编写大量的SQL语句。

EF框架的主要作用是将数据库中的表和表之间的关系映射到.NET平台上的对象模型中,使开发人员可以使用面向对象的编程技术进行数据库操作。它提供了一组强大的API,包括通过LINQ进行数据查询、插入、更新和删除等常见的数据操作。

  • EF框架的作用和优势
  1. 简化数据访问: EF框架提供了简单易用的API,使开发人员能够以面向对象的方式进行数据操作,而不必关心底层数据库操作的细节。
  2. 提高开发效率: 使用EF框架可以减少手动编写SQL语句的工作量,节省开发时间,提高开发效率。
  3. 跨数据库支持: EF框架支持多种数据库,包括SQL Server、MySQL、Oracle等,使开发人员能够轻松切换和适应不同的数据库环境。
  4. 面向对象的数据操作: EF框架将数据库中的表和关系转换为对象模型,使开发人员可以使用面向对象的编程技术,如继承、多态等,更方便地进行数据操作。
  5. 可维护性和可重用性: 使用EF框架可以提高代码的可读性、可维护性和可重用性,使软件开发更加灵活和可靠。
  • EF框架在软件开发中的应用场景
  1. 企业级应用开发: EF框架适用于开发大型企业级应用程序,其中数据访问是一个关键组成部分。它可以简化数据操作,并提供强大的查询功能,有助于提高开发效率和应用性能。
  2. Web应用开发: EF框架可以与ASP.NET和ASP.NET Core等Web开发框架集成,用于处理数据库操作。它可以帮助开发人员快速构建可靠的Web应用程序,并提供高效的数据访问。
  3. 移动应用开发: EF框架可以与移动应用开发框架(如Xamarin)结合使用,用于处理本地数据库的访问。它可以简化移动应用的数据管理,并提供一致的数据访问接口。
  4. 服务端开发: EF框架可以与ASP.NET Web API或WCF等服务端开发技术结合使用,用于处理数据的持久化和访问。它可以帮助开发人员快速构建可靠的服务端应用程序,并提供强大的数据操作功能。

二、EF6框架基础

1. 数据模型和实体类

定义实体模型类,表示数据库中的表和表之间的关系。

public class Product
{public int Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}public class Order
{public int Id { get; set; }public DateTime OrderDate { get; set; }public List<Product> Products { get; set; }
}

2. 数据库上下文(DbContext)介绍

创建派生自DbContext的类,用于与数据库进行交互。

public class MyDbContext : DbContext
{public DbSet<Product> Products { get; set; }public DbSet<Order> Orders { get; set; }
}

3. 配置数据模型与数据库表的映射关系

两种方式Fluent API和数据注解

Fluent API

重写DbContext的OnModelCreating方法在其方法内进行映射

public class MyDbContext : DbContext
{public DbSet<Product> Products { get; set; }public DbSet<Order> Orders { get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Entity<Product>().ToTable("Product").HasKey(p => p.Id);modelBuilder.Entity<Order>().ToTable("Order").HasKey(o => o.Id);}}

数据注解

[Table("Product")] // 指定数据库表的名称
public class Product
{[Column(TypeName = "bigint")]//映射到数据库中对应的字段数据类型[Key]//标识为主键 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//设置主键生成策略public int Id { get; set; }[Required]//标识字段为非空字段[Column(TypeName = "varchar")][StringLength(50)]//设置数据类型的大小    public string Name { get; set; }public decimal Price { get; set; }
}public class Order
{public int Id { get; set; }public DateTime OrderDate { get; set; }public List<Product> Products { get; set; }
}

在这里插入图片描述

4. 数据库迁移(Migration)概述

数据库迁移是一种管理数据库架构变更的方式,通过代码来自动更新数据库结构。

如果您在使用 Entity Framework 过程中遇到了 “No migrations configuration type was found in the assembly” 错误,这通常意味着缺少迁移配置。

在 Entity Framework 中,每个项目都需要一个迁移配置类用于管理数据库迁移。迁移配置类是从 DbMigrationsConfiguration 基类派生而来的。这个类负责指定数据库提供程序、连接字符串以及其他与迁移相关的配置。

如果您使用的是 Entity Framework 6,请按照以下步骤执行 “Enable-Migrations” 命令添加迁移配置:

  1. 打开 Visual Studio,并打开您的项目。
  2. 打开“包管理器控制台”窗口。可以在 Visual Studio 菜单栏中选择 “工具” > “NuGet 包管理器” > “程序包管理器控制台”。
  3. 在“程序包管理器控制台”窗口中,确保 “默认项目” 下拉菜单中选择了您的项目。
  4. 在 “程序包管理器控制台” 窗口中输入以下命令:
Enable-Migrations

这将创建一个名为 Configuration.cs 的迁移配置类,并添加到您的项目中。

a. 创建初始迁移

使用EF命令行工具创建初始迁移及数据库。

  1. 添加迁移:
Add-Migration InitialCreate

该命令将在代码中生成一个新的迁移文件,在该文件中定义了将应用于数据库的更改。

  1. 更新数据库:
Update-Database

该命令将应用迁移文件中定义的更改,并将这些更改应用到目标数据库中。

b. 更新迁移

在模型类或配置类发生变化后,生成并应用新的迁移脚本。

  1. 添加迁移:
Add-Migration AddNewColumn

该命令将在代码中生成一个新的迁移文件,并根据需要定义要应用于数据库的更改,例如添加新的列。

  1. 更新数据库:
Update-Database

该命令将应用迁移文件中定义的更改,并将这些更改应用到目标数据库中。

执行这些命令最后都会生成一个类
在这里插入图片描述

三、基本数据操作

1. 查询数据

a. 基本查询语法

使用LINQ查询语法从数据库中检索数据。

using (var context = new MyDbContext())
{var products = context.Products.ToList();// 执行查询操作
}

b. 条件查询和排序

根据条件查询数据,并进行排序操作。

using (var context = new MyDbContext())
{var products = context.Products.Where(p => p.Price > 10).OrderBy(p => p.Name).ToList();// 根据条件进行查询和排序
}

c. 关联查询

在查询中使用Include方法进行关联查询。

using (var context = new MyDbContext())
{var orders = context.Orders.Include(o => o.Products).ToList();// 进行关联查询
}

2. 插入数据

a. 添加单个实体

向数据库中插入单个实体。

using (var context = new MyDbContext())
{var product = new Product { Name = "Product1", Price = 20 };context.Products.Add(product);context.SaveChanges();// 添加单个实体到数据库
}

b. 批量添加实体

使用AddRange方法将多个实体添加到数据库。

using (var context = new MyDbContext())
{var products = new List<Product>{new Product { Name = "Product1", Price = 20 },new Product { Name = "Product2", Price = 30 }};context.Products.AddRange(products);context.SaveChanges();// 批量添加实体到数据库
}

3. 更新数据

a. 修改现有实体

修改数据库中现有的实体数据。

using (var context = new MyDbContext())
{var product = context.Products.Find(1);if (product != null){product.Name = "NewName";context.SaveChanges();// 修改现有实体数据}
}

b. 批量更新实体

通过查询条件批量更新数据库中的实体数据。

using (var context = new MyDbContext())
{var products = context.Products.Where(p => p.Price > 10);foreach (var product in products){product.Price += 5;}context.SaveChanges();// 批量更新实体数据
}

4. 删除数据

a. 删除单个实体

从数据库中删除单个实体。

using (var context = new MyDbContext())
{var product = context.Products.Find(1);if (product != null){context.Products.Remove(product);context.SaveChanges();// 删除单个实体}
}

b. 批量删除实体

通过查询条件批量删除数据库中的实体。

using (var context = new MyDbContext())
{var products = context.Products.Where(p => p.Price < 10);context.Products.RemoveRange(products);context.SaveChanges();// 批量删除实体
}

四、性能优化

延迟加载和预加载是提高性能的两种常用策略。

延迟加载(Lazy Loading)是指当需要访问导航属性时,才加载相关的数据。这样可以避免不必要的数据加载,减少了查询的开销。例如,在使用 EF6 进行查询时,可以通过禁用延迟加载来减少查询所涉及的数据量:

context.Configuration.LazyLoadingEnabled = false;

预加载(Eager Loading)是指在查询时一次性加载所有相关数据,以减少后续的查询操作。可以使用 Include 方法或 Include 字符串参数来预加载相关的导航属性。下面是一个示例:

var orders = context.Orders.Include(o => o.Customer).ToList();

查询优化技巧包括使用合适的查询方法和索引来提高查询性能。例如,使用 Where 条件来限制结果集的大小,使用 Select 投影出所需的列,以及使用索引来加速查询操作。

缓存机制是通过将数据存储在内存中,减少对数据库的访问次数,从而提高性能。可以使用内存缓存(如 MemoryCache)或分布式缓存(如 Redis)来实现缓存机制。

批量处理数据是指通过使用批量操作来一次性处理多个数据项,而不是逐个进行操作。例如,在 EF6 中可以使用 AddRange 方法来一次性插入多条数据。这样可以减少数据库连接和事务的开销,提高插入、更新和删除的性能。

下面是一个结合代码的示例,展示如何使用延迟加载、预加载、查询优化和批量处理数据来提高性能:

// 延迟加载
var customer = context.Customers.FirstOrDefault();
var orders = customer.Orders.ToList(); // 当访问导航属性时,相关的订单数据才会被加载// 预加载
var orders = context.Orders.Include(o => o.Customer).ToList(); // 一次性加载所有订单及其关联的顾客数据// 查询优化
var smallOrders = context.Orders.Where(o => o.Amount < 100).ToList(); // 仅查询金额小于 100 的订单数据// 缓存机制
var cachedData = memoryCache.Get("CachedData");
if (cachedData == null)
{cachedData = GetDataFromDatabase();memoryCache.Set("CachedData", cachedData, TimeSpan.FromMinutes(10));
}// 批量处理数据
var newCustomers = GetNewCustomers();
context.Customers.AddRange(newCustomers); // 一次性插入多个新顾客数据
context.SaveChanges();

五、错误处理和日志记录

1.异常处理和日志记录

异常处理和日志记录是保证应用程序稳定性和可维护性的重要组成部分。

异常处理可以通过捕获并处理可能出现的异常情况来避免应用程序崩溃或产生不可预料的结果。在代码中使用 try-catch 块来捕获异常,并根据需要进行相应的处理或恢复操作。以下是一个示例:

try
{// 执行可能出现异常的代码// ...
}
catch (Exception ex)
{// 处理异常,例如记录日志、发送警报、回滚事务等LogException(ex);// 进行适当的错误处理
}

在处理异常时,可以根据具体的异常类型进行不同的处理逻辑。例如,可以使用多个 catch 块来捕获特定的异常类型并执行相应的处理代码。

日志记录工具的选择与使用可以根据需求和技术栈进行选择。常见的日志记录工具包括 log4net、NLog、Serilog 等。选择合适的工具后,可以配置日志级别(如 Debug、Info、Warning、Error 等)和输出方式(如控制台、文件、数据库等)。下面是一个使用 log4net 的示例:

// 配置log4net
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));// 记录日志
private static readonly ILog log = LogManager.GetLogger(typeof(Program));// 使用示例
log.Debug("Debug message");
log.Info("Info message");
log.Warn("Warning message");
log.Error("Error message", exception);

通过日志记录工具,可以记录应用程序运行过程中的关键信息、异常信息以及其他有助于排查问题的数据。日志的输出可以用于开发调试、故障排除和性能分析等场景。

综上所述,异常处理和日志记录是构建健壮应用程序的重要环节。合理地处理异常并记录日志可以提高应用程序的可靠性和可维护性。如果还有任何问题,请随时提问。

2. EF框架的日志记录配置

在Entity Framework框架中,可以通过配置来记录日志以便调试和性能优化。下面是一些常见的操作来配置EF框架的日志记录:

  1. 配置日志记录器: 首先,需要配置一个日志记录器来处理EF框架的日志消息。可以使用第三方的日志库,如NLog、Serilog,或使用内置的日志功能。

  2. 配置DbContext: 在应用程序的DbContext类中,可以通过重写OnConfiguring方法来配置日志记录。在该方法中,可以指定要使用的日志记录器,并设置日志级别。

例子如下(使用Microsoft.Extensions.Logging):

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{// 配置日志记录器ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>{builder.AddConsole(); // 添加控制台输出作为日志记录器// 可以添加其他日志记录器,如AddFile等});// 设置DbContext的日志记录器optionsBuilder.UseLoggerFactory(loggerFactory).EnableSensitiveDataLogging(); // 启用敏感数据日志记录// 其他配置...
}
  1. 设置日志级别: 在配置日志记录器时,可以设置日志的级别以过滤不需要的日志消息。常见的级别有InformationWarningError等。

  2. 输出SQL查询语句: 如果需要记录EF框架生成的SQL查询语句,可以启用敏感数据日志记录(EnableSensitiveDataLogging),这将在日志中显示生成的SQL语句和参数值。但请注意,由于敏感数据可能包含敏感信息,如密码等,因此要谨慎处理和存储这些日志。

  3. 处理日志消息: 在配置日志记录器时,可以添加处理程序来对日志消息进行处理。例如,可以将日志消息写入日志文件、发送到远程服务器或进行其他自定义操作。具体的处理方式取决于所使用的日志库和需求。

配置EF框架的日志记录可以帮助我们更好地了解EF框架在运行时生成的SQL查询语句、执行时间等信息,有助于调试和性能优化。根据实际需求,可以按照上述步骤来配置和自定义EF框架的日志记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub: Masashi: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容&#xff0c;tftp服务在1337端口 sshfolder.txt内容&#xff0c…

日200亿次调用,喜马拉雅网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《API网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/微博/…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——减法原理除法原理

减法原理 正面难则反着做(“ − - −”号) 【思路】当出现“至少、至多”、“否定用语"等正面较难分类的题目&#xff0c;可以采用反面进行求解&#xff0c;注意部分反面的技巧以及“且、或"的反面用法。 除法原理 看到相同&#xff0c;定序用除法消序( “ &quo…

python批量下载csdn文章

声明&#xff1a;该爬虫只可用于提高自己学习、工作效率&#xff0c;请勿用于非法用途&#xff0c;否则后果自负 功能概述&#xff1a; 根据待爬文章url(文章id)批量保存文章到本地&#xff1b;支持将文中图片下载到本地指定文件夹&#xff1b;多线程爬取&#xff1b; 1.爬取…

插入排序——希尔排序

1、简述&#xff1a; 希尔排序(Shells Sort)是插入排序的一种又称“缩小增量排序”&#xff08;Diminishing Increment Sort&#xff09;&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。 希尔排…

[杂谈]-快速了解直接内存访问 (DMA)

快速了解直接内存访问 (DMA) 文章目录 快速了解直接内存访问 (DMA)1、使用 DMA 需要什么&#xff1f;2、DMA介绍3、DMA 中的数据传输如何进行&#xff1f;4、DMA接口5、DMAC 控制器寄存器6、DMA 控制器编程模式6.1 突发模式&#xff08;Burst Mode&#xff09;6.2 循环窃取模式…

无人机集群路径规划MATLAB:孔雀优化算法POA求解无人机集群三维路径规划

一、无人机模型简介 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 二、孔雀优化算法POA介绍 孔雀优化算法( Peafowl Optimization Algorithm, POA), 是由 Jingbo Wang 等于2022 年提出的一种群体智能优化算法。其灵感来源于孔雀的群体行为。 智能优化算法&am…

Nebula数据库安装

1、什么是nebula NebulaGraph是一款开源的、分布式的、易扩展的原生图数据库&#xff0c;能够承载包含数千亿个点和数万亿条边的超大规模数据集&#xff0c;并且提供毫秒级查询。 2、利用docker-compose安装Nebula数据库 1、前提条件 主机中安装了docker主机中安装了Docke…

基于改进莱维飞行和混沌映射的粒子群优化BP神经网络分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【git】【IDEA】在idea中使用git

目录 一、 在IDEA中配置git 二、 获取git仓库 2.1 本次初始化仓库 2.2 从远程仓库克隆 三、 本地仓库操作 3.1 将文件加入暂存区 3.2 将暂存区的文件提交到版本库 3.3 快捷键 使用快捷键 实现加入到暂存区与提交到版本库 3.4 查看日志 Show History 四、 远程仓库操…

springboot初试elasticsearch

引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…

MySQL性能分析工具的使用

1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f;这里把思考的流程整理成下面这张图。 整个流程划分成了 观察&#xff08; Show status &#xff09; 和 行动&#xff08; Action &#xff09; 两个部分。字母 S 的部分…

2023-python-import耗时是为什么?

场景 场景&#xff1a; 树莓派4B 离线安装【arch64架构】 了 torch,sklearn等机器学习库 运行程序文件时候&#xff0c; import的时间总共花了 10s&#xff0c;无法忍受。 查阅下网站&#xff1a; import官方说辞 看蒙了&#xff0c;太多了&#xff1b; 反正就看看大概&…

手写Spring:第9章-Aware感知容器对象

文章目录 一、目标&#xff1a;Aware感知容器对象二、设计&#xff1a;Aware感知容器对象三、实现&#xff1a;Aware感知容器对象3.1 工程结构3.2 Spring感知接口类图3.3 定义标记接口和容器感知类3.3.1 定义标记接口3.3.2 对象工厂感知接口3.3.3 类加载感知接口3.3.4 对象名称…

Java“牵手”唯品会商品详情数据,唯品会商品详情API接口,唯品会API接口申请指南

唯品会平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取唯品会商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;…

大数据Flink(七十四):SQL的滑动窗口(HOP)

文章目录 SQL的滑动窗口(HOP) SQL的滑动窗口(HOP) 滑动窗口定义:滑动窗口也是将元素指定给固定长度的窗口。与滚动窗口功能一样,也有窗口大小的概念。不一样的地方在于,滑动窗口有另一个参数控制窗口计算的频率(滑动窗口滑动的步长)。因此,如果滑动的步长小于窗口大…

UNext:基于 MLP 的快速医学图像分割网络

UNext 会议分析摘要贡献方法整体框架1.Shifted MLP2.Tokenized MLP Stage 实验1.对比实验2.消融实验2.1 模块的消融实验2.2 通道数的探索 可借鉴参考 会议分析 期刊&#xff08;会议&#xff09;名&#xff1a; MICCAI 2022 会议信息&#xff1a; 属于顶会了 有代码&#xff1…

【经验分享】如何使用VSCode对比两个文件

问题&#xff1a; 当有两个不同版本的文件&#xff0c;如何使用VSCode对比两个文件 解决办法 长按ctrl选择想要对比的两个文件-----右键选择将已选项进行比较----大功告成 大功告成

【LangChain系列 4】Model I/O——Prompts概述

原文地址&#xff1a;【LangChain系列 4】Model I/O——Prompts概述 本文速读&#xff1a; Prompt模版 样本选择器 Prompts简单来讲就是一组指令或文本输入&#xff0c;语言模型理解它的意思后&#xff0c;给出一个输出响应。 LangChain提供了一些模块可以让我们更方便地使…

vue 分页器组件+css动画效果

全网都找了一遍没有找到符合UI需求的分页动画&#xff0c;于是就主动上手了 需求&#xff1a; 1、分页最多显示9页&#xff0c;总页数最多显示无上限&#xff1b; 2、点击下一页的时候需要有动画效果过度&#xff0c;如果当前页数是当前显示最后的一页&#xff0c;则停了当前…