복합 형식 - EF 디자이너
이 항목에서는 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를 자동으로 호출합니다.
엔터티의 속성을 새 복합 형식으로 리팩터링
개념적 모델에 엔터티가 이미 있는 경우 일부 속성을 복합 형식 속성으로 리팩터링할 수 있습니다.
디자이너 화면에서 엔터티의 탐색 속성을 제외한 하나 이상의 속성을 선택하고 마우스 오른쪽 단추로 클릭한 다음 리팩터링 -> 새 복합 형식으로 이동을 선택합니다.
선택한 속성의 새 복합 형식이 모델 브라우저에 추가됩니다. 복합 형식에 기본 이름이 지정됩니다.
새로 만든 형식의 복합 속성이 선택된 속성을 대체합니다. 모든 속성 매핑은 유지됩니다.
새 복합 형식 만들기
기존 엔터티의 속성을 포함하지 않는 새 복합 형식을 만들 수도 있습니다.
모델 브라우저에서 복합 형식 폴더를 마우스 오른쪽 단추로 클릭하고 새 복합 형식 추가...를 가리킵니다. 또는 복합 형식 폴더를 선택하고 키보드에서 삽입 키를 누를 수 있습니다.
새 복합 형식이 기본 이름의 폴더에 추가됩니다. 이제 형식에 속성을 추가할 수 있습니다.
복합 형식에 속성 추가
복합 형식의 속성은 스칼라 형식 또는 기존 복합 형식일 수 있습니다. 그러나 복합 형식 속성에는 순환 참조가 있을 수 없습니다. 예를 들어, 복합 형식 OnsiteCourseDetails에는 복합 형식 OnsiteCourseDetails의 속성이 있을 수 없습니다.
아래에 나열된 방법 중 하나를 사용하여 복합 형식에 속성을 추가할 수 있습니다.
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 스칼라 속성 또는 복합 속성을 가리키고 원하는 속성 형식을 선택합니다. 또는 복합 형식을 선택한 다음 키보드에서 삽입 키를 누를 수 있습니다.
새 속성이 기본 이름의 복합 형식에 추가됩니다.
또는 -
EF 디자이너 화면에서 엔터티 속성을 마우스 오른쪽 단추로 클릭하고 복사를 선택한 다음 모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 붙여넣기를 선택합니다.
복합 형식의 이름 바꾸기
복합 형식의 이름을 바꾸면 프로젝트 전체에서 형식에 대한 모든 참조가 업데이트됩니다.
모델 브라우저에서 복합 형식을 천천히 두 번 클릭합니다. 이름이 선택되고 편집 모드가 됩니다.
또는 -
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 이름 바꾸기를 선택합니다.
또는 -
Model 브라우저에서 복합 형식을 선택하고 F2 키를 누릅니다.
또는 -
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 속성 창에서 이름을 편집합니다.
엔터티에 기존 복합 형식 추가 및 테이블 열에 해당 속성 매핑
엔터티를 마우스 오른쪽 단추로 클릭하고 새로 추가를 가리킨 후 복합 속성을 선택합니다. 기본 이름의 복합 형식 속성이 엔터티에 추가됩니다. 기존 복합 형식에서 선택한 기본 형식이 속성에 할당됩니다.
원하는 형식을 속성 창의 속성에 할당합니다. 복합 형식 속성을 엔터티에 추가한 후에는 해당 속성을 테이블 열에 매핑해야 합니다.
디자인 화면이나 모델 브라우저에서 엔터티 형식을 마우스 오른쪽 단추로 클릭하고 테이블 매핑을 선택합니다. 테이블 매핑이 매핑 정보 창에 표시됩니다.
<테이블 이름>에 매핑 노드를 확장합니다. 열 매핑 노드가 나타납니다.
열 매핑 노드를 확장합니다. 테이블의 모든 열이 나열된 목록이 나타납니다. 열이 매핑되는 기본 속성이 있는 경우 값/속성 머리글 아래에 나열됩니다.
매핑할 열을 선택한 다음 해당 값/속성 필드를 마우스 오른쪽 단추로 클릭합니다. 모든 스칼라 속성을 나열한 드롭다운 목록이 표시됩니다.
적절한 속성을 선택합니다.
각 테이블 열별로 6 ~ 7단계를 반복합니다.
참고 항목
열 매핑을 삭제하려면 매핑할 열을 선택한 다음 값/속성 필드를 클릭합니다. 그런 다음 드롭다운 목록에서 삭제를 선택합니다.
복합 형식에 함수 가져오기 매핑
Function Import는 저장 프로시저를 기반으로 합니다. Function Import를 복합 형식에 매핑하려면 해당 저장 프로시저에서 반환하는 열의 수와 복합 형식의 속성 수가 일치해야 하고 스토리지 형식이 속성 형식과 호환되어야 합니다.
복합 형식에 매핑할 가져온 함수를 두 번 클릭합니다.
다음과 같이 새 Function Import에 대한 설정을 입력합니다.
함수 가져오기를 만드는 저장 프로시저를 저장 프로시저 이름 필드에 지정합니다. 이 필드는 스토리지 모델의 모든 저장 프로시저가 표시되는 드롭다운 목록입니다.
함수 가져오기 이름 필드에서 함수 가져오기 이름을 지정합니다.
반환 형식을 복합으로 선택한 다음, 드롭다운 목록에서 적절한 형식을 선택하여 특정 복합 반환 형식을 지정합니다.
확인을 클릭합니다. Function Import 항목이 개념적 모델에 만들어집니다.
함수 가져오기에 대한 열 매핑 사용자 지정
- 모델 브라우저에서 함수 가져오기를 마우스 오른쪽 단추로 클릭하고 함수 가져오기 매핑을 선택합니다. 매핑 정보 창이 나타나고 해당 함수 가져오기에 대한 기본 매핑을 보여줍니다. 화살표는 열 값과 속성 값 사이의 매핑을 나타냅니다. 기본적으로 열 이름은 복합 형식의 속성 이름과 같다고 간주됩니다. 기본 열 이름은 회색 텍스트로 나타납니다.
- 필요한 경우 Function Import에 대응하는 저장 프로시저에서 반환된 열 이름과 일치하도록 열 이름을 변경합니다.
복합 형식 삭제
복합 형식을 삭제하면 개념적 모델에서 형식이 삭제되고 형식의 모든 인스턴스에 대한 매핑이 삭제됩니다. 그러나 형식에 대한 참조는 업데이트되지 않습니다. 예를 들어, 엔터티에 형식이 ComplexType1인 복합 형식 속성이 있으며 ComplexType1이 모델 브라우저에서 삭제된 경우 해당 엔터티 속성이 업데이트되지 않습니다. 모델은 삭제된 복합 형식을 참조하는 엔터티를 포함하기 때문에 유효성을 검사하지 않습니다. Entity Designer를 사용하여 삭제된 복합 형식에 대한 참조를 업데이트하거나 삭제할 수 있습니다.
모델 브라우저에서 복합 형식을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.
또는 -
Model 브라우저에서 복합 형식을 선택한 다음 키보드의 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