공부/EFCore

[EFCore] SaveChanges를 호출하면 어떤 일이 일어날까

돌멩이수프 2022. 9. 4. 22:01
728x90

 

1️⃣ 추가된 객체들의 상태가 Unchaged로 바뀐다.

참고 : https://codingjin0424.tistory.com/124

 

2️⃣ SQL Identity로 PK를 관리한다. ▶ DB에 데이터를 추가한 후 ID를 클라로 받아와 객체의 ID Property를 채워준다.

 

3️⃣ Relationship을 참고해서 FK 세팅 및 연결을 완료한다.

 

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" };

        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);
		
        // 0 (기본 설정)
        Console.WriteLine(rookiss.PlayerId);
        db.SaveChanges();
        // 1 (rookiss가 ID 1로 설정됨)
        Console.WriteLine(rookiss.PlayerId);
    }
}

 

위 코드를 참고하면 SaveChanges를 하기 전에는 rookiss의 PlayerId가 0, 즉 데이터가 추가되지 않은 상태였고 SaveChanges 뒤에는 PlayerId가 1로 설정되었다.

728x90