欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > EF Core Interview

EF Core Interview

2024/10/24 21:26:42 来源:https://blog.csdn.net/m0_50985216/article/details/141091388  浏览:    关键词:EF Core Interview

1、性能调优小技巧

如果说查询出来的数据,只是做展示,不做增删改查,可以在查询的时候,增加AsNoTracking()方法,可以提高性能,可以避免在内存中存在副本;

建议在查询的时候,多使用Find()方法,会优先走内存缓存,如果内存已经存在,就不会去数据库中去查询数据;

2、说说对EF中SaveChanges的理解?

SaveChanges用于将对实体对象的更改(如新增、修改、删除)保存到数据库中。

2.1、执行过程

  • 检测变更

    • Entity Framework 会扫描 DbContext 中被追踪的所有实体对象,检测出哪些对象发生了变化(新增、修改或删除)。
  • 生成 SQL 命令

    • 根据检测到的变更,Entity Framework 会生成相应的 SQL 语句(如 INSERTUPDATEDELETE)以在数据库中执行这些更改。
  • 执行 SQL 命令

    • 生成的 SQL 命令将被发送到数据库执行。执行成功后,相应的更改将被永久保存在数据库中。
  • 更新实体状态

    • 数据库成功更新后,Entity Framework 会相应地更新 DbContext 中实体对象的状态。例如,对于新插入的实体,其状态将从 "Added" 变为 "Unchanged"。

2.2、特点

  • 事务支持:本身就是一个事务
  • 检测并跟踪实体的状态变化
  • 某些错误处理,比如并发冲突会抛出 DbUpdateConcurrencyException 异常

3、什么是EF Core?

        EF Core是微软提供的一个开源对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式操作数据库,而不需要编写SQL语句。也是Entity Framework的轻量级、跨平台版本,具有更好的性能和更多的特性。

        工作原理是通过将数据库中的表映射成实体(Entity)类,然后通过LINQ查询和操作这些实体类来实现与数据库的交互。

4、请谈谈Code First和Db First两种开发方式的区别及优缺点。

Code First:

定义:先创建实体模型,然后efcore根据实体模型去生成数据库的架构

优点:

  • 灵活性高: 开发者可以完全控制代码结构,模型变化可以通过代码迁移直接更新数据库。
  • 版本控制: 数据库的每次变更都可以通过迁移脚本记录在代码仓库中,便于追踪和回滚。
  • 模型优先: 更贴近业务逻辑,开发者可以根据需求设计数据模型,再根据模型生成数据库。

缺点

  • 不适合现有数据库
  • 学习曲线: 对于不熟悉迁移机制的开发者,需要一些学习和适应的时间。
  • 数据库性能调优: 有时自动生成的数据库架构未必是最优的,可能需要手动干预来优化性能。

适用场景

  • 新项目开发,从零开始设计数据库架构。
  • 小型或中型项目,数据库模型随业务需求频繁变化。
  • 希望将数据库结构和业务逻辑的代码紧密结合,并进行版本控制。

Db First:

定义 :是指从一个现有的数据库开始开发,生成相应的数据模型和上下文类。

优点

  • 快速开发: 对已有数据库的项目,可以迅速生成数据访问层,减少重复劳动。
  • 支持复杂数据库结构: 可以更好地处理已有复杂数据库,尤其是涉及存储过程、视图和触发器等高级数据库功能。
  • 简单易用: 不需要开发者编写数据模型,EF Core 会自动生成对应的类。

缺点

  • 代码可读性差: 自动生成的代码可能较为复杂,且不完全符合业务逻辑,难以维护。
  • 模型定制困难: 需要手动修改生成的代码来适应业务需求,但下次重新生成时这些更改可能会被覆盖。
  • 模型与数据库不一致: 如果数据库发生变化,需要重新生成模型,手动同步模型和数据库结构的工作量较大。
  • 迁移管理困难: 由于模型不是手动创建的,管理数据库迁移的复杂性可能增加。

适用场景

  • 维护或扩展已有的大型复杂数据库。
  • 数据库设计已经完成,且不需要频繁更改的项目。
  • 数据库团队和开发团队分开运作,开发者只需基于数据库进行应用开发。

5、如何在EF中执行查询操作?

        可以使用LINQ查询来执行查询操作。例如,在Code First方式中,可以通过DbContextSet<TEntity>()方法获取实体集合,然后使用LINQ查询。

6、如何处理EF中的延迟加载和显式加载?

        EF默认使用延迟加载来加载关联实体。另外,还可以使用Load()方法来显式加载实体。

预加载是指在查询数据时,通过Include()或ThenInclude()方法预先加载关联实体。可以在一次查询中获取所有相关数据,但会增加数据传输量。

延迟加载是指在访问导航属性时,EF会延迟加载关联实体,等真正用到关联实体的时候再加载。可以减少数据量、提高查询性能,但可能导致N+1查询问题。

using (var context = new MyDbContext())
{var user = context.Users.Include(u => u.Orders).FirstOrDefault(u => u.Id == userId);// 或者var order = context.Orders.Find(orderId);context.Entry(order).Reference(o => o.User).Load();
}

7、如何优化EF的性能?

  • 使用AsNoTracking()方法来取消跟踪查询结果
  • 使用Select()方法来只选择需要的字段,避免不必要的加载和查询。

8、请解释EF中的数据迁移(Migration)是什么?如何使用数据迁移?

数据迁移是一种管理数据库模式更改的机制,可以保持数据库结构与代码模型的同步

9、在EF中如何处理并发冲突?

        可以使用EF的乐观并发控制机制来处理并发冲突。通过在实体类中添加一个时间戳(Timestamp)属性或一个版本号(RowVersion)属性,并在保存更改时检查这些属性,可以避免潜在的并发问题。

10、什么是数据库迁移种子数据(Seed Data)?

数据库迁移种子数据是指在应用程序第一次运行时自动填充到数据库中的初始数据。可以使用EF的种子数据功能来预先插入一些初始数据。

public class MyDbContext : DbContext
{protected override void OnModelCreating(ModelBuilder modelBuilder){// 添加种子数据modelBuilder.Entity<User>().HasData(new User { Id = 1, Name = "John" },new User { Id = 2, Name = "Alice" });}
}

11、什么是EF中的DbContext生命周期?

DbContext生命周期指的是DbContext对象在应用程序中的使用方式和生命周期。通常情况下,一个请求(Request)对应一个DbContext实例,它在请求开始时创建,并在请求结束时销毁。这样可以确保每个请求都有自己的DbContext,避免并发和数据混乱的问题。

12、EF中的Include方法和ThenInclude方法有什么作用?

        Include方法用于Eager Loading,它可以在查询时一次性加载指定的导航属性的数据,避免N+1查询问题。ThenInclude方法用于加载导航属性的导航属性的数据。

13、EF Core和EF6有什么区别?

        EF Core是Entity Framework的轻量级版本,专门为.NET Core设计。相比于EF6,EF Core具有更好的跨平台支持,更快的性能和更小的内存占用。然而,EF Core在功能上可能比EF6少一些,因为它是为轻量级应用程序和跨平台开发而设计的。

14、什么是导航属性(Navigation Property)?它们有什么作用?

        导航属性是指在实体类中定义的用于表示实体之间关系的属性。导航属性可以用于查询关联的数据和构建复杂的查询。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com