안녕하세요.
Blazor 강좌는 Part 3-1로 우선 공개했습니다.
너무 시간이 오래걸릴 것 같아서, Part 3-1, 3-2 형태로 제공될 예정입니다.
말씀주신 부분은 저도 처음에 경험을 했던 에러메시지인데요.
지금은 따로 이것을 만나지 않고 있어서,
제 소스를 찾아보니,
제 경우에는
(1)
DbContext 클래스의 생성자에서 아래 코드는 오히려 주석을 처리해두었고,
// ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
(2)
DI 컨테이너에 등록하는 Startup.cs 파일의 코드는 다음처럼 모든 코드 뒤에 ServiceLifetime.Transient 옵션을 두었습니다.
services.AddEntityFrameworkSqlServer().AddDbContext<NoticeAppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);
이 외에는 따로 처리한 사항은 없구요.
평상시 개발하는 형태로 CRUD를 진행하고 있습니다.
이 부분의 기능을 한번 검토해보세요.
다음 경로처럼,
2군데 소스를 테스트로 적용해보시는 것도 좋을 것 같습니다.
https://github.com/VisualAcademy/Hawaso/commit/955b3059d7f84e0302165269d31da4b0cdd70bf0#diff-f1c1e2218ffc7fe8070a8862b74b227392ee766bc50235103bda6e113df28358
이상입니다.
On 2020-10-26 오전 10:22:00, '안정준' wrote:
안녕하세요 블레이저강의 3번째 편이 올라와서 반가웠습니다.
블레이저로 개발을 하고 있는데 한가지 문제가 부닥쳤습니다.
ef core 로 repository를 만들어 블레이저 페이지내에서 DI를 사용했는데
리스트를 GetAllAsync후 DB에서 자료를 수정했을때 다시 GetAllAsync하면 수정된 자료가 반영이 되지 않습니다. 그래서 구글링해서
_context.ChangeTracker.QueryTrackingBehavior = Microsoft.EntityFrameworkCore.QueryTrackingBehavior.NoTracking; 트랙킹을 비활성화 해서
수정된 자료로 검색하는데는 성공했습니다.
그런데 문제가 수정에서 또 발생했습니다.
public async Task<bool> EditAsync(EX_EVENT model)
{
_context.tbl_EX_EVENTS.Attach(model);;
_context.Entry(model).State = EntityState.Modified;
return (await _context.SaveChangesAsync() > 0 ? true : false);
}
EditAsync로 수정시 한번은 수정이 되나 두번째 같은 자료를 EditAsync 하면
Message = "The instance of entity type 'EX_EVENT' cannot be tracked because another instance with the same key value for {'EX_EVENT_NUM'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attach...
이런 에러가 뜹니다.
트랙킹을 활성화하고 아예 페이지를 강제로 리로드하면 DI가 다시 생성이 되어 최근 데이터로 검색도 되고 문제는 안생기는 추후 scope를 사용하면 다 날라가게되어 좋은 방법이 아닌것 같아 방법을 찾고 있습니다.
그리고 혹시 페이지를 리로드 하지 않고도 DI를 재 생성할 수 있는 방법이 있을까요?
결국 이러다 ef core 포기하고 dapper로 가야하나 고민중입니다.