实体状态 分离状态 未更改状态 已添加状态 已删除状态 已修改状态 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会执行相应的数据库操作(插入、更新、删除)。
浙公网安备 33010602011771号