컴공의 일상/C#
[.NET core] SqlKata 사용 시 유의사항 - FirstOrDefaultAsync<>
코딩하는 젤리
2024. 7. 24. 11:59
SqlKata 를 가지고 열심히 실습을 하던 중..
GET 해올 때 모두 초기 값으로 읽어오는 오류를 발견했다.
분명 이전에도 만났던 오류 같은데 정리를 안해두어서 똑같이 삽질을 한시간..을 했다.
그래서 내가 보려고 적어둔다............
[결론]
FirstOrDefaultAsync<> 이런 식으로 바로 읽어오지말고,
FirstOrDefaultAsync(); 이렇게 읽어와서 추후에 객체를 생성해 각각 매핑해주자
읽어오는데 None 으로 읽어오는게 아니라
그냥 초기값으로 읽어와서 정말.. 오류를 찾기 힘들었는데,
쿼리문을 직접 넣어서 비교해보니 FirstOrDefaultAsync<>로 바로 내가 설정한 Model class 형식으로 가져오려고 해서 생기는 문제라는 것을 알게 되었다.
public async Task<CharInfo> GetCharInfoDataAsync(string playerId) // 오류 있음
{
var charInfo = await _queryFactory.Query("char_info")
.Where("player_id", playerId)
.FirstOrDefaultAsync<CharInfo>(); // 이 부분에서 매핑 시 오류?
return charInfo;
}
FirstOrDefaultAsync<CharInfo> 이런 식으로 읽어올 때 CharInfo 형식으로 가져올 때 오류가 난 것 같다..
따라서 아래처럼 FirstOrDefaultAsync()로 읽어온다음, 객체를 생성해서 매핑해주는 것이 안전하다!
public async Task<CharInfo> GetCharInfoDataAsync(string playerId)
{
try
{
var result = await _queryFactory.Query("char_info")
.Where("player_id", playerId)
.Select("player_id", "char_name", "char_exp", "char_level", "char_win", "char_lose", "char_draw")
.FirstOrDefaultAsync();
if (result == null)
{
_logger.LogWarning("No data found for playerId: {PlayerId}", playerId);
return null;
}
var charInfo = new CharInfo
{
PlayerId = result.player_id,
CharName = result.char_name,
Exp = result.char_exp,
Level = result.char_level,
Win = result.char_win,
Lose = result.char_lose,
Draw = result.char_draw
};
_logger.LogInformation("GetCharInfoDataAsync succeeded for playerId: {PlayerId}", playerId);
return charInfo;
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred while getting char info data for playerId: {PlayerId}", playerId);
throw;
}
}
무서운 녀석, 앞으로도 <> 는 조심해서 사용하자.
지금 글 작성하다가 든 생각인데, 애초에 넣을 때 new로 생성해서 받으면 문제 없을 것 같긴 하네요..
(아래 같은 느낌으로)
public async Task<bool> UpdateCharacterNameAsync(string playerId, string newCharName)
{
var affectedRows = await _queryFactory.Query("char_info")
.Where("player_id", playerId)
.UpdateAsync(new { char_name = newCharName });
return affectedRows > 0;
}
* 틀린 부분이 있다면 댓글 부탁드립니다