Entity Framework의 CreateOrUpdate 메서드에서 try-catch를 사용해도 되나요?
-
22-07-2019 - |
문제
이렇게 하는 것이 허용됩니까?먼저 엔터티를 추가해 보세요.추가가 실패하면 엔터티가 이미 존재한다는 의미이므로 문제가 되지 않습니다.
아니면 더 우아하고 쉬운 솔루션이 있습니까?
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
try
{
dal.AddToXXXXXX(xxxxxxx);
}
catch
{
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
알았어, 줄였어...
EntityFrameworkEntities dal = EntityDataModelHelper.GetEntityDataModel();
if(xxxxxxx.ID == 0)
{
dal.AddToXXXXXX(xxxxxxx);
}
try
{
dal.SaveChanges();
return true;
}
catch
{
return false;
}
해결책
확실히 ~ 아니다 괜찮아요. C# 유형이없는 캐치 문은 "표준 또는 비표준 예외를 잡는"것을 의미합니다. 그러나 당신은 중복 추가를 방지하는 것입니다. 기존 항목을 나타내지 않는 여러 가지 이유로 추가가 실패 할 수 있습니다. 예를 들어,이 방법은 널리 참조를 던질 수 있으며 추가되었다고 가정합니다.
중복 추가를 확인하려면 ~ 해야 하다 중복 추가에 대한 예외 만 포착하십시오.
다른 팁
IfExists 스타일 메서드로 시작한 다음 실제로 변경 사항이 없으면 변경 사항 저장을 건너뛰는 것이 좋습니다.
Lucas가 지적했듯이 try-catch 블록은 catch 블록에 빠지면 큰 오버헤드를 가지므로 일반적으로 항목이 이미 존재하는지 확인할 수 있는 방법이 없는 한 이에 의존하고 싶지 않습니다.
If 문의 작업을 수행하기 위해 try-catch를 사용하지 마십시오.Try-catch는 예상치 못한 특이한 이벤트에 사용됩니다.
편집하다업데이트된 코드에서는 "AddToXXXXXX" 메서드에서 발생하는 예외를 포착하지 못했습니다.
당신은해야합니다
If(!XXXXXX.Contains(newItemValue))
{
try
{
add...
savechanges...
}
catch
{
}
}
또는 Add 및 Savechanges를 다른 try-catch 블록으로 분리할 수 있지만 이는 Add가 실패하더라도 SaveChanges가 실행되는 경우에만 필요합니다.
첫 번째 Try-Catch를 IF 문으로 바꿀 수 있습니다. 그래도 두 번째를 원한다고 생각합니다.
편집하다: 또한 그들이 무엇인지에 관계없이 한 블록에서 모든 예외를 포착하는 것이 좋습니다.
추신 : 캐치 블록은 IF 문보다 더 많은 처리 능력 (시간)을 사용합니다.