EF Core实体的五种不同的状态

Entity Framework Core

Entity Framework Core是一个基于.NET Core的ORM框架,用于将对象表示转换为数据库中的数据。它提供了一组API,使得开发人员可以使用面向对象的方式来对关系数据库进行操作。

实体对象五种不同的状态:

  1. Detached(未跟踪):实体对象没有被上下文追踪,也没有和数据库进行关联。这通常发生在新创建的对象或者已经从上下文中删除的对象上。
  2. Unchanged(未修改):实体对象已经被上下文追踪,并且与数据库中的数据一致。这意味着该实体对象的属性没有被修改过。
  3. Added(新增):实体对象是通过上下文的Add方法添加到上下文中的,但尚未保存到数据库。此时,对象被标记为新增状态。
  4. Modified(已修改):实体对象的一个或多个属性已被修改。这通常发生在修改了实体对象的属性后,但尚未调用上下文的SaveChanges方法进行保存操作。
  5. Deleted(已删除):实体对象是通过上下文的Remove方法从上下文中移除的,但尚未从数据库中删除。此时,对象被标记为删除状态。
    这些实体状态反映了实体对象在上下文中的状态以及其与数据库之间的关系。根据实体对象的状态,Entity Framework Core会执行相应的操作来保持对象与数据库的一致性,例如插入、更新或删除操作。

Detached(未跟踪):

场景:当你需要创建一个新的实体对象,并且不打算将其与数据库关联时,可以使用未跟踪状态。

csharp 复制代码
var newEntity = new Entity { Name = "New Entity" };// 此时newEntity处于Detached状态

Unchanged(未修改):

场景:当你查询数据库并获取一个实体对象时,该对象的属性与数据库中的数据一致,且不需要进行任何修改时,可以使用未修改状态。

csharp 复制代码
var entity = dbContext.Entities.FirstOrDefault(e => e.Id == entityId);// 此时entity处于Unchanged状态

Added(新增):

场景:当你想要将一个新创建的实体对象保存到数据库时,可以使用新增状态。

csharp 复制代码
var newEntity = new Entity { Name = "New Entity" };
dbContext.Entities.Add(newEntity);// 现在newEntity处于Added状态

Modified(已修改):

场景:当你需要修改实体对象的属性,并将这些更改保存到数据库时,可以使用已修改状态。

csharp 复制代码
var entity = dbContext.Entities.FirstOrDefault(e => e.Id == entityId);
entity.Name = "Updated Name";// 此时entity处于Modified状态

Deleted(已删除):

场景:当你想要从数据库中删除一个实体对象时,可以使用已删除状态。

csharp 复制代码
var entity = dbContext.Entities.FirstOrDefault(e => e.Id == entityId);
dbContext.Entities.Remove(entity);// 现在entity处于Deleted状态

演示了如何使用Entity Framework Core进行数据操作:

步骤一

安装Entity Framework Core NuGet包:

Install-Package Microsoft.EntityFrameworkCore

步骤二

创建一个数据库上下文类,并在该类中定义要映射到数据库的实体:

csharp 复制代码
using Microsoft.EntityFrameworkCore;

public class MyDbContext : DbContext
{
    public DbSet<Entity> Entities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        //连接自己数据库
        optionsBuilder.UseSqlServer("Data Source=(local);Initial Catalog=MyDatabase;Integrated Security=True");
    }
}

步骤三

创建实体Entity

csharp 复制代码
public class Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

步骤四

使用数据库上下文类来执行数据操作:

csharp 复制代码
using (var dbContext = new MyDbContext())
{
    // 新增一个实体对象
    dbContext.Entities.Add(new Entity { Name = "New Entity" });

    // 查询所有实体对象
    var entities = dbContext.Entities.ToList();

    // 修改一个实体对象
    var entity = dbContext.Entities.FirstOrDefault(e => e.Id == entityId);
    entity.Name = "Updated Name";

    // 删除一个实体对象
    var entityToRemove = dbContext.Entities.FirstOrDefault(e => e.Id == entityId);
    dbContext.Entities.Remove(entityToRemove);

    // 将所有更改保存到数据库
    dbContext.SaveChanges();
}
相关推荐
foenix668 分钟前
PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题
android·unity·c#·xr·pico
浪前9 分钟前
【项目篇之消息持久化】仿照RabbitMQ模拟实现消息队列
java·数据库·rabbitmq·ruby
数据库砖家39 分钟前
YashanDB 知识库|轻松打通多库数据,YashanDB DBLink 使用指南!
数据库
二进制_博客40 分钟前
高德MCP制作旅游攻略
数据库·旅游
数据库砖家40 分钟前
YashanDB 知识库|如何用闪回功能救回误删的数据?全流程实战演示
数据库
码观天工42 分钟前
.NET 原生驾驭 AI 新基建实战系列(五):Milvus ── 大规模 AI 应用的向量数据库首选
c#·.net·milvus·向量数据库·高性能
数据库砖家44 分钟前
YashanDB 知识库|手把手教你回收表空间,释放磁盘的正确姿势!
数据库
一只栖枝1 小时前
关于OCP认证:有Oracle和MySQL两种
数据库·mysql·oracle·开闭原则·数据管理·ocp认证
小Tomkk1 小时前
StarRocks SRCA 考试心得总结
数据库·数据库 starrocks·srca