怪奇物语

怪奇物语

首页 新随笔 联系 管理

实体状态 分离状态 未更改状态 已添加状态 已删除状态 已修改状态 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 2024-11-27 08:00  超级无敌美少男战士  阅读(106)  评论(0)    收藏  举报