[EFCore] Entity State, 엔티티의 상태를 알아보자

2022. 9. 4. 21:57·공부/EFCore
728x90

 

State는 5가지가 있다.

 

✅ Detached

AsNoTracking을 붙인 것과 같이 추적되지 않는 상태를 말하며 Savechanges를 해도 아무 변화가 없다.

 

✅ Unchanged

DB에 정보가 들어있고 클라이언트에서 아무런 수정사항이 없는 상태다. Savechanges를 해도 아무 변화가 없다.

 

✅ Deleted

DB에 정보가 들어있고, 그 정보를 클라가 삭제한 상태를 말한다. Savechanges를 하면 DB 정보가 삭제된다.

 

✅ Modified

DB에 정보가 들어있고, 클라에서 정보를 수정한 상태다. Savechages를 하면 DB 정보가 업데이트 된다.

 

✅ Added

DB에 없는 새로운 정보를 클라가 생성한 상태다. Savechanges를 하면 DB에 새로운 데이터가 업로드된다.

 

 

public class DbCommands
{
    public static void InitializeDB(bool forceReset = false)
    {
        using (AppDbContext db = new AppDbContext())
        {
            if (!forceReset && (db.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists())
                return;

            db.Database.EnsureDeleted();
            db.Database.EnsureCreated();

            CreateTestData(db);
            Console.WriteLine("DB Initialized");
        }
    }

    public static void CreateTestData(AppDbContext db)
    {
        var rookiss = new Player() { Name = "Rookiss" };
        var faker = new Player() { Name = "Faker" };
        var deft = new Player() { Name = "Deft" };

        // 1) Detached
        Console.WriteLine(db.Entry(rookiss).State);

        List<Item> items = new List<Item>()
        {
            new Item()
            {
                TemplateId = 101,
                CreateDate = DateTime.Now,
                Owner = rookiss
            },
            new Item()
            {
                TemplateId = 102,
                CreateDate = DateTime.Now,
                Owner = faker
            },
            new Item()
            {
                TemplateId = 103,
                CreateDate = DateTime.Now,
                Owner = deft
            }
        };

        Guild guild = new Guild()
        {
            GuildName = "T1",
            Members = new List<Player>() { rookiss, faker, deft }
        };

        db.Items.AddRange(items);
        db.Guilds.Add(guild);

        // 2) Added (Items -> Owner. 간접적으로 rookiss를 Add해도 정식 Add가 된다)
        Console.WriteLine(db.Entry(rookiss).State);
        
        db.SaveChanges();

        // 3) Unchanged
        Console.WriteLine(db.Entry(rookiss).State);
    }
}

 

주석처리한 곳만 주의해서 보면 된다.

1️⃣ new Player를 통해 이름을 정해준 상황은 DB에는 아무런 수정사항이 없고 클라에서만 데이터를 추가하는 내용을 작성했을 뿐이니 상태는 Detached가 된다.

2️⃣ db.Items.AddRange를 통해 아이템을 올려주었으니 상태는 Added다. 참고로 우리는 rookiss라는 Player를 따로 DB에 올리지 않았다. Item, Owner 설정을 통해 간접적으로 Player를 추가해도 Player가 정상적으로 DB에 저장된다는 것을 알 수 있다.

3️⃣ SaveChanges를 완료한 상황이다. DB와 클라에 차이가 없으니 상태는 Unchanged다.

 

728x90

'공부 > EFCore' 카테고리의 다른 글

[EFCore] DB에 이미 존재하는 사용자를 PK로 연결하려면?  (0) 2022.09.04
[EFCore] SaveChanges를 호출하면 어떤 일이 일어날까  (0) 2022.09.04
[EFCore] Eager Loading / Explicit Loading / Select Loading  (0) 2022.09.02
[EFCore] Include VS ThenInclude  (0) 2022.09.02
[EFCore] System.TypeInitializationException과 Unable to load 'sni.dll' 오류해결하기  (0) 2022.09.01
'공부/EFCore' 카테고리의 다른 글
  • [EFCore] DB에 이미 존재하는 사용자를 PK로 연결하려면?
  • [EFCore] SaveChanges를 호출하면 어떤 일이 일어날까
  • [EFCore] Eager Loading / Explicit Loading / Select Loading
  • [EFCore] Include VS ThenInclude
돌멩이수프
돌멩이수프
Information technology
  • 돌멩이수프
    WHAT DOES "IT" STAND FOR?
    돌멩이수프
  • 전체
    오늘
    어제
    • 분류 전체보기 (239)
      • 언어 (73)
        • html (3)
        • css (1)
        • java (6)
        • C (26)
        • C++ (2)
        • C# (29)
      • 공부 (7)
        • Unity (43)
        • 게임 서버 (26)
        • 네트워크 (5)
        • 데이터베이스 (7)
        • EFCore (19)
        • 기타 (14)
        • Git (5)
        • 운영체제 (1)
        • 소프트웨어공학 (21)
      • 2024-여름 (12)
      • 자기 관리 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    unity
    tcp
    C언어
    게임서버
    네트워크
    라즈베리파이
    EFCore
    Python
    C#
    디자인패턴
    EntityFramework
    C
    coding
    자바
    HTML
    백준
    코딩
    Entityfamework
    유니티
    java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
돌멩이수프
[EFCore] Entity State, 엔티티의 상태를 알아보자
상단으로

티스토리툴바