공부/EFCore
[EFCore] Entity State, 엔티티의 상태를 알아보자
돌멩이수프
2022. 9. 4. 21:57
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