怪物奇妙物语

宇宙无敌超级美少男的怪物奇妙物语

首页 新随笔 联系 管理
  819 随笔 :: 0 文章 :: 2 评论 :: 16万 阅读

实体状态 分离状态 未更改状态 已添加状态 已删除状态 已修改状态 Entity Framework DetachedUnchangedAddedDeletedModified efcore

五种状态

  1. Detached(分离状态)

    • 当实体对象被创建但尚未与任何Entity Framework上下文关联时,处于分离状态。
    • 例如,通过new关键字创建一个新的实体对象,但还没有将其添加到数据库上下文中,此时该实体就是分离状态。
    • 在分离状态下,对实体的更改不会自动反映到数据库中。
  2. Unchanged(未更改状态)

    • 当从数据库中查询到一个实体后,该实体默认处于未更改状态。
    • 表示该实体与数据库中的数据是一致的,没有进行任何修改操作。
  3. Added(已添加状态)

    • 当通过数据库上下文的Add方法将一个新实体添加到上下文中时,该实体处于已添加状态。
    • 这意味着当调用SaveChangesSaveChangesAsync方法时,Entity Framework会将该实体插入到数据库中。
  4. Deleted(已删除状态)

    • 当通过数据库上下文的Remove方法将一个实体标记为删除时,该实体处于已删除状态。
    • 调用SaveChangesSaveChangesAsync方法时,Entity Framework会从数据库中删除该实体对应的记录。
  5. Modified(已修改状态)

    • 当对已查询到的实体的属性进行了修改后,该实体的状态会变为已修改状态。
    • 例如,修改了一个从数据库中获取的电影实体的TitlePrice属性,此时该实体就处于已修改状态。
    • 在调用SaveChangesSaveChangesAsync方法时,Entity Framework会根据实体的当前状态生成相应的SQL语句来更新数据库中的记录。

通过跟踪和管理实体的状态,Entity Framework能够准确地知道在数据库中应该执行哪些操作(插入、更新、删除),以保持数据库与应用程序中实体数据的一致性。

代码示例

以下是一个简单的代码示例,展示了在Entity Framework中实体状态的使用方法:

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
namespace EFEntityStatesExample
{
class Program
{
static void Main()
{
using (var context = new MyDbContext())
{
// 创建一个新的实体对象,此时处于Detached状态
var newMovie = new Movie { Title = "New Movie", ReleaseDate = new DateTime(2023, 1, 1), Genre = "Action", Price = 9.99m };
// 查看新实体的状态并打印
Console.WriteLine($"New movie state: {GetEntityState(newMovie)}");
// 将新实体添加到上下文中,状态变为Added
context.Movies.Add(newMovie);
// 查看添加后实体的状态并打印
Console.WriteLine($"New movie state after adding: {GetEntityState(newMovie)}");
// 从数据库中查询一个实体,默认处于Unchanged状态
var existingMovie = context.Movies.FirstOrDefault(m => m.Id == 1);
if (existingMovie!= null)
{
// 查看查询到的实体的状态并打印
Console.WriteLine($"Existing movie state: {GetEntityState(existingMovie)}");
// 修改查询到的实体的属性,状态变为Modified
existingMovie.Price = 12.99m;
// 查看修改后实体的状态并打印
Console.WriteLine($"Existing movie state after modification: {GetEntityState(existingMovie)}");
// 模拟删除操作,将实体标记为Deleted
context.Movies.Remove(existingMovie);
// 查看删除后实体的状态并打印
Console.WriteLine($"Existing movie state after deletion: {GetEntityState(existingMovie)}");
}
// 保存所有更改到数据库
context.SaveChanges();
}
}
static string GetEntityState<T>(T entity) where T : class
{
var entry = context.Entry(entity);
return entry.State.ToString();
}
}
public class MyDbContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 配置数据库连接字符串,这里使用内存数据库作为示例
optionsBuilder.UseInMemoryDatabase(databaseName: "MyDatabase");
}
}
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
}

在上述示例中:

  • 首先创建了一个新的Movie实体对象,它处于Detached状态。
  • 然后通过context.Movies.Add方法将其添加到上下文中,此时状态变为Added
  • 接着从数据库中查询一个Movie实体,它初始为Unchanged状态。
  • 修改查询到的实体的Price属性后,其状态变为Modified
  • 最后通过context.Movies.Remove方法将该实体标记为Deleted,并调用context.SaveChanges方法将所有更改保存到数据库中。根据实体的不同状态,Entity Framework会执行相应的数据库操作(插入、更新、删除)。
posted on   超级无敌美少男战士  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2022-11-27 todolist 外观模式
点击右上角即可分享
微信分享提示