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();
}
相关推荐
+VX:Fegn08957 分钟前
计算机毕业设计|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计·旅游
百锦再10 分钟前
国产数据库的平替亮点——关系型数据库架构适配
android·java·前端·数据库·sql·算法·数据库架构
wusp199413 分钟前
基于vite + nodejs + MongoDB + vue2 的博客发布系统
数据库·mongodb
全栈小513 分钟前
【数据库】浙人医携手金仓数据库,打造全国首个多院区异构多活容灾架构
数据库·1024程序员节·金仓
她说彩礼65万39 分钟前
C# 反射
java·算法·c#
studytosky1 小时前
Linux 基础开发工具(3):Git 控制与 GDB 调试实用指南
linux·运维·服务器·网络·数据库·git
凌睿马1 小时前
关于复杂数据结构从MySQL迁移到PostgreSQL的可行性
数据结构·数据库·mysql
是一个Bug1 小时前
声明式事务:深度解析与实战指南
数据库·oracle
laocooon5238578861 小时前
C#二次开发中简单块的定义与应用
android·数据库·c#
不穿格子的程序员1 小时前
Redis篇4——Redis深度剖析:内存淘汰策略与缓存的三大“天坑”
数据库·redis·缓存·雪崩·内存淘汰策略