实体状态 分离状态 未更改状态 已添加状态 已删除状态 已修改状态 Entity Framework Detached
、Unchanged
、Added
、Deleted
、Modified
efcore
五种状态
-
Detached
(分离状态):- 当实体对象被创建但尚未与任何Entity Framework上下文关联时,处于分离状态。
- 例如,通过
new
关键字创建一个新的实体对象,但还没有将其添加到数据库上下文中,此时该实体就是分离状态。 - 在分离状态下,对实体的更改不会自动反映到数据库中。
-
Unchanged
(未更改状态):- 当从数据库中查询到一个实体后,该实体默认处于未更改状态。
- 表示该实体与数据库中的数据是一致的,没有进行任何修改操作。
-
Added
(已添加状态):- 当通过数据库上下文的
Add
方法将一个新实体添加到上下文中时,该实体处于已添加状态。 - 这意味着当调用
SaveChanges
或SaveChangesAsync
方法时,Entity Framework会将该实体插入到数据库中。
- 当通过数据库上下文的
-
Deleted
(已删除状态):- 当通过数据库上下文的
Remove
方法将一个实体标记为删除时,该实体处于已删除状态。 - 调用
SaveChanges
或SaveChangesAsync
方法时,Entity Framework会从数据库中删除该实体对应的记录。
- 当通过数据库上下文的
-
Modified
(已修改状态):- 当对已查询到的实体的属性进行了修改后,该实体的状态会变为已修改状态。
- 例如,修改了一个从数据库中获取的电影实体的
Title
或Price
属性,此时该实体就处于已修改状态。 - 在调用
SaveChanges
或SaveChangesAsync
方法时,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会执行相应的数据库操作(插入、更新、删除)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
2022-11-27 todolist 外观模式