인터넷에 돌아다니는 코드 중에 'DbContext'를 너무 오래 유지하는 코드를 많이 봅니다.심지어 싱글톤으로 만들어서 사용하는 경우도 종종 보이는데요....'DbContext'는 살아있는 시간(사용량)에 비례하여 덩치가 커지는 녀석이라 가능하면 짧게 유지해야 합니다. 이 포스팅은 'DbContext'가 왜 이런 동작을 하는지 알아보기 위한 포스팅입니다. * 주의 *이 포스팅에서 기준이 되는 정보는 메모리 사용량입니다..NET에서는 정상적인 메모리 해제 코드를 사용했어도 여러 가지 요인에 의해 해제가 지연되는 경우가 있습니다.그러므로 메모리 사용량은 추세로 보는 것이 좋습니다.아니면 프로그램이 올라오고 별다른 작업이 없어 메모리에 쌓인 내용이 없는 시점에 체크하는 방법이 있습니다. 1. 'DbCont..
FK(ForeingKey)를 설정하고 자식으로 대상을 추가하면 자식이 검색되지 않는 현상을 발견했습니다. 1. 증상 재연 부모를 아래와 같이 만듭니다. /// /// FK키가 자동으로 증가되는 오류 재연용1 /// public class AutoIncreases_Test1 { /// /// 고유키 /// [Key] public long idAutoIncreases_Test1 { get; set; } /// /// 표시 데이터 /// public string Name { get; set; } = string.Empty; /// /// 외래키에 연결된 리스트 /// [ForeignKey("idAutoIncreases_Test1")] public ICollection Test2 { get; set; } = n..
이전 포스팅에서 여러 종류의 DB를 한 프로젝트에서 사용하기 위한 설명을 했습니다. 이 포스팅에서는 여러 DB를 관리하기 위해 제가 정리한 코드를 설명합니다. 연관글 영역 0. 테이블로 사용할 모델 테이블로 사용할 모델을 만들어 줍니다. 이 포스팅에서는 테스트 용도로 아래 모델을 선언했습니다. //Test1Model.cs /// /// 테스트용 모델 /// public class Test1Model { /// /// 고유키 /// [Key] public long idTest1Model { get; set; } /// /// 숫자형 /// public int Int { get; set; } /// /// 문자형 /// public string Str { get; set; } = string.Empty; /..
몇 가지 관리 이슈 때문에 저는 FK(ForeingKey)를 잘 활용을 하지 않았는데... 원래는 적극적으로 FK를 사용하는 것이 좋습니다. 일단 검색 속도가 빨라지는 큰 장점이 있기 때문입니다. 그리고 테이블 간 관계성이 명확해집니다. 0. 테스트 준비하기 이 포스트팅에 사용하는 모델 정보는 다음과 같습니다. (참고 : dang-gun/EntityFrameworkSample/ForeignKeyTest/ModelsDB ) ForeignKeyTest1_Blog.cs namespace ModelsDB; /// /// 테스트용 테이블 /// public class ForeignKeyTest1_Blog { /// /// 고유키 /// [Key] public long idTest1Blog { get; set; }..
1. 에러의 발견 포스트그레스 사용 시 다음과 같은 에러가 나는 경우가 있습니다. System.InvalidCastException: ''timestamp with time zone' literal cannot be generated for Local DateTime: a UTC DateTime is required' 포스트그레스 프로바인더가 6.x 버전부터 시간대가 포함된 타임스템프(timestamp with timezone)로 매핑해야 한다고 합니다. 2. ' DbContext'에서 설정하기 간편하게 해결하는 방법은 'DbContext'를 생성할 때 레거시 모드를 설정해 주는 것입니다. public ModelsDbContext_Postgresql(DbContextOptions options) : ba..
EF(Entity Framework, 엔트리 프레임워크)에서 데이터의 무결성을 확보하기 위해 '낙관적 동시성(Optimistic Concurrency)'을 어떻게 구현하는지 알아봅시다. 0. 낙관적 동시성을 쓰는 이유 낙관적 동시성을 쓰는 이유를 알려면 알아두어야 할 내용이 있습니다. 0-1. 비관적 동시성 DB에서 데이터의 일관성유지를 위해 락(lock)을 거는 방법이 있습니다. 이렇게 락을 거는 방법을 '비관적 동시성(Pessimisitc Concurrency)'이라고 합니다. 이 방법은 누군가 데이터를 수정하는 동안 다른 사람은 수정할 수 없게 만드는 방법입니다. 다른 사람이 수정할 수 없으니 절대적인 데이터 무결성이 보장된다는 장점이 있습니다. 하지만 동시에 여러 사람이 수정하려는 경우 나머지 사..
EF(Entity framework)를 사용하다 보면 가장 불편한 것이 정렬입니다. 앵? '.OrderBy', 'OrderByDescending' 하면 되는데요? 맞습니다. 문제는 일반적인 게시판의 정렬처럼 조건이 다양한 정렬의 경우 각각 오더바이(Orderby)를 따로 호출해야 한다는 것입니다. 1. 문제의 시작 아래는 일반적인 게시판을 정렬하기 위한 코드입니다. switch (sColumn) { case "idTestOrderBy": if(true == bAsc) { iqTO = iqTO.OrderBy(ob => ob.idTestOrderBy); } else { iqTO = iqTO.OrderByDescending(ob => ob.idTestOrderBy); } break; case "Str": if..
EF(Entity Framework)에서 FK(foreign key)를 걸면 자동으로 List 타입을 관리해줍니다. FK가 개발 중에는 좋은데 서비스 중에는 좀 단점이 있고(특정 데이터를 수동으로 지우려면 연결된 FK를 순서대로 뒤에서부터 지워야 함.) 자동으로 바인딩 되다 보니 무분별하게 난발하게 돼서 속도를 다 까먹는 문제가 있습니다. (잘 관리하면 좋긴 합니다. ㅎㅎㅎ) EF는 FK로 묶인 데이터에 접근하면 인덱스로 전체 선택(select)해서 처리하기 때문입니다. ㅎㄷㄷ 그래서 저는 가급적 FK를 안 쓰고 수동으로 선택(select)해서 사용하는 방법을 사용합니다. 그러다 보니 EF에서 리스트형 데이터들은 어떻게 처리되는지 궁금해졌습니다. 1. 배열과 리스트 모델을 아래와 같이 선언하고 마이그레이..
엔티티 프레임워크 같은 프레임워크를 객체 관계형 매핑(Object–relational mapping), 줄여서 ORM이라고 부릅니다. 이런 프레임워크의 장점 중 하나가 약간의 작업만 하면 다양한 DB를 연결할 수 있다는 것입니다. 이 포스팅에서는 'SQLite'와 'MSSQL'를 따로따로 마이그레이션하고 사용하겠습니다. 다른 DB도 얼마든지 추가할 수 있습니다. 연관글 영역 0. 프로젝트 생성 DB 테이블 모델과 컨텍스트(DbContext)를 관리할 프로젝트를 생성합니다. 여기에서 마이그레이션 버전관리가 이루어집니다. '클래스 라이브러리'로 프로젝트를 생성합니다. (프로젝트 이름 : EfMultiMigrations) 누겟에서 아래 종속성을 찾아 설치합니다. Microsoft.EntityFrameworkC..
이전 포스팅에서는 하나의 DB에 여러 컨텍스트를 사용하기 위해 각각 마이그레이션을 생성해서 관리하는 방법을 사용했습니다. 이 방법은 여러 개의 마이그레이션을 관리해야 해서 불편함이 많습니다. 그래서 전체를 관리하는 컨텍스트를 만들고 마이그레이션과 조인이 필요할 때는 이 '전체 컨텍스트'를 따로 만들어 사용하는 것이 좋습니다. 연관글 영역 0. 방법 이 방법의 단점은 전체용 컨텍스트를 따로 관리해야 한다는 것인데..... 관리와 성능의 이점을 생각하면 이 정도는 단점이라고 할수 없죠 ㅎㅎㅎㅎ 결국 마이그레이션만 따로 관리할 뿐 컨택스트를 하나만 쓰는 것과 다름없는 구조가 됩니다. 기본 세팅 이전 포스팅에서 (참고 : [Entity Framework 6] 하나의 DB에 여러 컨텍스트(Multiple DbCo..