이 항목에서는 EF 디자이너(Entity Framework Designer)를 사용하여 복합 형식을 매핑하는 방법과 복합 형식의 속성을 포함하는 엔터티를 쿼리하는 방법을 보여 줍니다.
다음 이미지는 EF 디자이너로 작업할 때 사용되는 기본 창을 보여 줍니다.
메모
개념적 모델을 빌드할 때 매핑되지 않은 엔터티 및 연결에 대한 경고가 오류 목록에 나타날 수 있습니다. 모델에서 데이터베이스를 생성하도록 선택한 후에 오류가 사라지므로 이러한 경고를 무시할 수 있습니다.
복합 형식이란?
복합 형식은 엔터티 내에서 스칼라 속성을 구성할 수 있도록 하는 엔터티 형식의 비 스칼라 속성입니다. 엔터티와 마찬가지로 복합 형식은 스칼라 속성 또는 기타 복합 형식 속성으로 구성됩니다.
복합 형식을 나타내는 개체를 사용하는 경우 다음 사항에 유의하세요.
- 복합 형식에는 키가 없으므로 독립적으로 존재할 수 없습니다. 복합 형식은 엔터티 형식 또는 기타 복합 형식의 속성으로만 존재할 수 있습니다.
- 복합 형식은 연결에 참여할 수 없으며 탐색 속성을 포함할 수 없습니다.
- 복합 형식 속성은 null일 수 없습니다. **InvalidOperationException **은 DbContext.SaveChanges 가 호출되고 null 복합 개체가 발견될 때 발생합니다. 복합 개체의 스칼라 속성은 null일 수 있습니다.
- 복합 형식은 다른 복합 형식에서 상속할 수 없습니다.
- 복합 형식을 클래스로 정의해야 합니다.
- EF는 DbContext.DetectChanges 가 호출되면 복합 형식 개체의 멤버 변경 내용을 검색합니다. Entity Framework는 DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, DbContext.Entry, DbChangeTracker.Entries 멤버가 호출되면 DetectChanges를 자동으로 호출합니다.
엔터티의 속성을 새 복합 형식으로 리팩터링
개념적 모델에 엔터티가 이미 있는 경우 일부 속성을 복합 형식 속성으로 리팩터링할 수 있습니다.
디자이너 화면에서 엔터티의 하나 이상의 속성(탐색 속성 제외)을 선택한 다음 마우스 오른쪽 단추를 클릭하고 리팩터링 -> 새 복합 형식으로 이동합니다.
선택한 속성이 있는 새 복합 형식이 모델 브라우저에 추가됩니다. 복합 형식에는 기본 이름이 지정됩니다.
새로 만든 형식의 복합 속성은 선택한 속성을 대체합니다. 모든 속성 매핑이 유지됩니다.
새 복합 형식 만들기
기존 엔터티의 속성을 포함하지 않는 새 복합 형식을 만들 수도 있습니다.
모델 브라우저에서 복합 형식 폴더를 마우스 오른쪽 단추로 클릭하고 AddNew 복합 형식...을 가리킵니다. 또는 복합 형식 폴더를 선택하고 키보드에서 삽입 키를 누를 수 있습니다.
새 복합 형식이 기본 이름을 사용하여 폴더에 추가됩니다. 이제 형식에 속성을 추가할 수 있습니다.
복합 형식에 속성 추가
복합 형식의 속성은 스칼라 형식 또는 기존 복합 형식일 수 있습니다. 그러나 복합 형식 속성에는 순환 참조가 있을 수 없습니다. 예를 들어 복합 형식 OnsiteCourseDetails 는 복합 형식 OnsiteCourseDetails의 속성을 가질 수 없습니다.
아래에 나열된 방법으로 복합 형식에 속성을 추가할 수 있습니다.
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 스칼라 속성 또는 복합 속성을 가리킨 다음 원하는 속성 형식을 선택합니다. 또는 복잡한 유형을 선택한 다음 키보드에서 삽입 키를 누를 수 있습니다.
기본 이름을 사용하여 복합 형식에 새 속성이 추가됩니다.
또는-
EF 디자이너 화면에서 엔터티 속성을 마우스 오른쪽 단추로 클릭하고 복사를 선택한 다음 모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 붙여넣기를 선택합니다.
복합 형식 이름 바꾸기
복합 형식의 이름을 바꾸면 형식에 대한 모든 참조가 프로젝트 전체에서 업데이트됩니다.
모델 브라우저에서 복합 형식을 천천히 두 번 클릭합니다. 이름이 선택되고 편집 모드로 설정됩니다.
또는-
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 이름 바꾸기를 선택합니다.
또는-
모델 브라우저에서 복합 형식을 선택하고 F2 키를 누릅니다.
또는-
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 속성 창에서 이름을 편집합니다.
엔터티에 기존 복합 형식을 추가하고 해당 속성을 테이블 열에 매핑
엔터티를 마우스 오른쪽 단추로 클릭하고 새로 추가를 가리킨 후 복합 속성을 선택합니다. 기본 이름을 가진 복합 형식 속성이 엔터티에 추가됩니다. 기본 형식(기존 복합 형식에서 선택됨)이 속성에 할당됩니다.
속성 창의 속성에 원하는 형식을 할당합니다. 엔터티에 복합 형식 속성을 추가한 후에는 해당 속성을 테이블 열에 매핑해야 합니다.
디자인 화면 또는 모델 브라우저 에서 엔터티 형식을 마우스 오른쪽 단추로 클릭하고 테이블 매핑을 선택합니다. 테이블 매핑은 매핑 세부 정보 창에 표시됩니다.
맵을 테이블 이름< 노드로 > 확장합니다. 열 매핑 노드가 나타납니다.
열 매핑 노드를 확장합니다. 테이블의 모든 열 목록이 나타납니다. 값/속성 머리글 아래에 열이 매핑되는 기본 속성(있는 경우)이 나열됩니다.
매핑할 열을 선택한 다음 해당 값/속성 필드를 마우스 오른쪽 단추로 클릭합니다. 모든 스칼라 속성의 드롭다운 목록이 표시됩니다.
적절한 속성을 선택합니다.
각 테이블 열에 대해 6단계와 7단계를 반복합니다.
메모
열 매핑을 삭제하려면 매핑할 열을 선택한 다음 값/속성 필드를 클릭합니다. 그런 다음 드롭다운 목록에서 삭제 를 선택합니다.
함수 가져오기를 복합 형식에 매핑
함수 가져오기는 저장 프로시저를 기반으로 합니다. 함수 가져오기를 복합 형식에 매핑하려면 해당 저장 프로시저에서 반환되는 열이 복합 형식의 속성과 일치해야 하며 속성 형식과 호환되는 스토리지 형식이 있어야 합니다.
복합 형식에 매핑하려는 가져온 함수를 두 번 클릭합니다.
다음과 같이 새 함수 가져오기에 대한 설정을 입력합니다.
저장 프로시저 이름 필드에서 함수 가져오기를 만드는 저장 프로시저 를 지정합니다. 이 필드는 스토리지 모델의 모든 저장 프로시저를 표시하는 드롭다운 목록입니다.
함수 가져오기 이름 필드에서 함수 가져오기의 이름을 지정합니다.
반환 형식으로 복합 을 선택한 다음 드롭다운 목록에서 적절한 형식을 선택하여 특정 복합 반환 형식을 지정합니다.
OK를 클릭합니다. 함수 가져오기 항목은 개념적 모델에서 만들어집니다.
함수 가져오기에 대한 열 매핑 사용자 지정
- 모델 브라우저에서 함수 가져오기를 마우스 오른쪽 단추로 클릭하고 함수 가져오기 매핑을 선택합니다. 매핑 세부 정보 창이 나타나고 함수 가져오기에 대한 기본 매핑이 표시됩니다. 화살표는 열 값과 속성 값 간의 매핑을 나타냅니다. 기본적으로 열 이름은 복합 형식의 속성 이름과 동일한 것으로 간주됩니다. 기본 열 이름은 회색 텍스트로 표시됩니다.
- 필요한 경우 함수 가져오기에 해당하는 저장 프로시저에서 반환되는 열 이름과 일치하도록 열 이름을 변경합니다.
복합 형식 삭제
복합 형식을 삭제하면 형식이 개념 모델에서 삭제되고 형식의 모든 인스턴스에 대한 매핑이 삭제됩니다. 그러나 형식에 대한 참조는 업데이트되지 않습니다. 예를 들어 엔터티에 ComplexType1 형식의 복합 형식 속성이 있고 Model Browser에서 ComplexType1이 삭제되면 해당 엔터티 속성이 업데이트되지 않습니다. 모델은 삭제된 복합 형식을 참조하는 엔터티를 포함하므로 유효성을 검사하지 않습니다. 엔터티 디자이너를 사용하여 삭제된 복합 형식에 대한 참조를 업데이트하거나 삭제할 수 있습니다.
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.
또는-
모델 브라우저에서 복합 유형을 선택하고 키보드에서 Delete 키를 누릅니다.
복합 형식의 속성을 포함하는 엔터티 쿼리
다음 코드에서는 복합 형식 속성을 포함하는 엔터티 형식 개체의 컬렉션을 반환하는 쿼리를 실행하는 방법을 보여 있습니다.
using (SchoolEntities context = new SchoolEntities())
{
var courses =
from c in context.OnsiteCourses
order by c.Details.Time
select c;
foreach (var c in courses)
{
Console.WriteLine("Time: " + c.Details.Time);
Console.WriteLine("Days: " + c.Details.Days);
Console.WriteLine("Location: " + c.Details.Location);
}
}
.NET