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();
}
相关推荐
【心态好不摆烂】2 分钟前
MySQL——复合查询
数据库·mysql
AC赳赳老秦6 分钟前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
瞬间&永恒~35 分钟前
【MySQL】 InnoDB 锁等待排查与并发压测实验
运维·数据库·mysql
布鲁飞丝43 分钟前
对 .NET线程 异常退出引发程序崩溃的反思
数据库·c#·.net
zcmodeltech1 小时前
智能矿井沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的感知-传输-控制一体化方案
服务器·数据库·分布式·stm32·单片机·嵌入式硬件
SamChan901 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
geovindu1 小时前
CSharp: LogHelper
开发语言·后端·c#·.net
江晓鱼未暖2 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
copyer_xyf2 小时前
PostgreSQL 做向量检索:一条单库路线
数据库·agent·nestjs
caishenzhibiao2 小时前
顺势捕猎者副图 同花顺期货通指标
java·c语言·c#