다음을 통해 공유


엔터티 키 사용(Entity Framework)

각 엔터티 형식에는 엔터티의 하나 이상의 스칼라 속성을 기반으로 하는 키가 있습니다. 키는 개념적 모델에서 Key 요소에 의해 정의됩니다. 관계형 데이터베이스의 경우처럼 이러한 키 값은 지정된 엔터티의 고유성을 확인하고 쿼리 성능을 높이는 데 사용됩니다. 일반적으로 키 속성은 기본 테이블의 키 열에 매핑됩니다. 키 열은 ID 열이나 고유 값을 보장하도록 제한된 다른 열입니다. 개념적 모델에서 키가 정의되는 방법에 대한 자세한 내용은 Key 요소(CSDL)을 참조하십시오.

개체가 개체 쿼리에서 반환되면 Entity Framework 는 엔터티 개체를 구체화합니다. 또한 엔터티 키를 EntityKey 클래스의 인스턴스로 구체화합니다. IEntityWithKey를 구현하는 개체의 EntityKey 속성에서 이 EntityKey에 액세스할 수 있습니다. 엔터티 데이터 모델 도구에서 생성된 모든 데이터 클래스의 기본 클래스인 EntityObjectIEntityWithKey를 구현합니다.

Dd283139.note(ko-kr,VS.100).gif참고:
Entity Framework 를 사용하는 경우 사용자 지정 데이터 클래스에서 IEntityWithKey를 구현하지 않아도 됩니다.

EntityKey 개체 생성 및 사용

EntityKey 개체는 EntitySetNameEntityContainerName 속성과 하나 이상의 키/값 쌍 배열로 구성됩니다. 키/값 쌍은 속성 이름과 속성 값으로 구성됩니다. EntityKeyValues 속성에서 하나 이상의 EntityKeyMember 개체로 키/값 쌍을 제공합니다.

Dd283139.note(ko-kr,VS.100).gif참고:
EntityKey 생성자 중 하나를 사용하는 경우 qualifiedEntitySetName 매개 변수에 제공된 문자열 값은 "EntityContainerName.EntitySetName"과 같이 앞에 EntityContainerName이 추가된 EntitySetName입니다.

ObjectContextCreateEntityKey 메서드를 사용하여 분리된 개체에 대한 EntityKey를 가져올 수도 있습니다. 개체에 유효한 키가 없는 경우 개체 컨텍스트는 지정된 개체에 대한 EntityKey 인스턴스를 새로 생성합니다. 자세한 내용은 방법: EntityKey 만들기(Entity Framework)를 참조하십시오.

엔터티 키가 엔터티를 고유하게 식별하기 때문에 나머지 개체 값이 데이터 소스에서 검색되지 않은 경우에도 키만 사용하여 엔터티를 만들고 개체를 개체 컨텍스트에 연결할 수 있습니다. 자세한 내용은 방법: 관련 개체 연결(Entity Framework)을 참조하십시오. 엔터티 키를 사용하여 개체 컨텍스트나 데이터 소스에서 개체를 검색할 수도 있습니다. 자세한 내용은 방법: 개체 키를 사용하여 특정 개체 반환(Entity Framework)을 참조하십시오.

고정 길이 엔터티 키

Entity Framework 는 데이터베이스의 기본 키에 해당하는 EntityKey의 값을 기반으로 ID 확인을 수행합니다. 쿼리에서 ObjectContext에 이미 있는 EntityKey가 포함된 개체를 반환하는 경우 새 개체가 만들어지지 않습니다. 데이터베이스에서 고정 크기 열로 작업할 때 데이터베이스에 지정된 크기보다 작은 값을 유지하는 경우 일부 데이터베이스는 고정 크기 형식을 공백이나 0으로 채웁니다. SQL Server에서는 고정 크기 문자열 형식을 후행 공백으로 채웁니다. 고정 크기 형식(예: binary 또는 char)이 기본 키로 사용되는 경우 ID 확인 문제가 발생할 수 있습니다.

다음 예제를 살펴보십시오. Product 테이블에는 기본 키에 대한 크기 10의 고정 길이 열이 있습니다. EntityKey AB100이 포함된 Product 개체가 만들어져 ObjectContext에 추가됩니다. 개체가 데이터베이스에 저장되면 열의 크기가 고정되어 있고 저장된 값이 데이터베이스의 크기보다 작기 때문에 키가 후행 공백으로 채워집니다. SQL Server에서 AB100을 채워진 문자열과 일치하는 것으로 인식하기 때문에 EntityKeyAB100인 개체에 대한 이후 쿼리는 다른 EntityKey(AB100 뒤에 후행 공백이 추가됨)가 포함된 개체를 반환합니다. Entity Framework 에서는 속성의 값을 자르거나 채우지 않습니다. 결과적으로 새 개체(EntityKey AB100 뒤에 후행 공백이 추가됨)가 ObjectContext에 추가됩니다.

Product p1= new Product 
{ 
    ProductID = "AB100", 
    Description = "New product" 
}; 
// An object with EntityKey "AB100" is added to ObjectContext.  ctx.Products.AddObject(p1); 
// The object is saved in the database with a primary key of 
// "AB100     " because the column is of a fixed size.  ctx.SaveChanges();
// When a query is executed for an object with key "AB100", SQL Server // matches the key to "AB100     ".  The result is that a new object 
// with EntityKey "AB100     " is added to ObjectContext.  Product p2 = ctx.Products.First(p => p.ProductCode == "AB100");  

다음 중 한 가지 방법을 수행하여 이러한 문제를 방지할 수 있습니다.

  • 데이터베이스에서 고정 길이 형식 대신 가변 길이 형식을 사용합니다.

  • 클라이언트에서 후행 공백이나 0으로 EntityKey의 값을 채웁니다. PadRight 메서드를 사용하여 문자열을 공백으로 채울 수 있습니다.

엔터티 키 및 추가된 개체

새 엔터티가 만들어지면 Entity Framework 는 임시 키를 정의하고 IsTemporary 속성을 true로 설정합니다. SaveChanges 메서드를 호출하면 Entity Framework 는 영구 키를 할당하고 IsTemporary 속성을 false로 설정합니다.

해당 열 값이 데이터베이스에서 생성되는 ID인 경우 저장소 모델에서 엔터티의 Property 요소에 대한 StoreGeneratedPattern 특성을 Identity로 설정합니다. 엔터티 데이터 모델 도구가 기존 데이터 소스에서 데이터 모델을 생성하면 StoreGeneratedPattern 특성이 데이터 소스의 ID 또는 계산된 열을 나타내는 각 Property 요소(CSDL) 요소에 추가됩니다. SaveChanges를 호출한 후 Entity Framework 는 임시 키의 속성 값을 데이터 소스에서 생성된 ID 값으로 바꿉니다.

임시 키를 서버에서 생성된 값이 포함된 영구 키로 바꾸는 내부 프로세스는 다음과 같습니다.

  1. 엔터티 개체가 생성됩니다.

    이 시점에서 모든 키 속성에는 기본값(null 또는 0)이 있습니다.

  2. ObjectContext 또는 ObjectSetAddObject 메서드를 호출하거나 관계의 “다(many)” 쪽에서 개체의 컬렉션에 개체를 추가하여 새 개체가 ObjectContext에 추가됩니다.

    이 시점에서 Entity Framework 는 ObjectStateManager에 개체를 저장하는 데 사용되는 임시 키를 생성합니다.

  3. SaveChangesObjectContext에서 호출됩니다.

    INSERT 문이 Entity Framework 에서 생성되고 데이터 소스에 대해 실행됩니다.

  4. INSERT 작업이 성공하면 서버에서 생성된 값이 다시 ObjectStateEntry에 작성됩니다.

  5. ObjectStateEntry가 서버에서 생성된 값으로 개체를 업데이트합니다.

  6. AcceptChangesObjectStateEntry에서 호출되면 서버에서 생성된 새 값을 사용하여 영구 EntityKey가 계산됩니다.

    Dd283139.note(ko-kr,VS.100).gif참고:
    SaveChanges 실행이 끝날 때나 SaveChanges 메서드가 AcceptAllChangesAfterSave 플래그를 사용하여 호출될 때 AcceptChanges가 자동으로 호출됩니다.

  7. ObjectStateManager는 임시 키의 모든 인스턴스를 새 영구 키로 바꿉니다.

GUID 속성 값

Entity Framework 는 고유성을 보장하기 위해 Guid 형식을 반환하는 엔터티 속성을 지원합니다.

Entity Framework 는 서버에서 생성된 GUID 형식 ID 값을 지원하지만, 공급자가 행이 삽입된 후 서버에서 생성된 ID 값을 반환할 수 있어야 합니다. SQL Server 2005 이상의 SQL Server는 OUTPUT 절을 통해 서버에서 생성된 GUID 형식을 반환할 수 있습니다. 공급자가 OUTPUT 절과 동일한 항목을 지원하지 않는 경우에는 클라이언트에서 새 개체에 대한 GUID 값을 생성합니다. 이렇게 하려면 SavingChanges 이벤트를 처리하여 Added 상태의 모든 엔터티 개체에 대한 GUID 값을 새로 생성하는 것이 좋습니다. 자세한 내용은 방법: 변경된 내용을 저장할 때 비즈니스 논리 실행(Entity Framework)을 참조하십시오.

Entity Data Model Wizard 또는 Update Model Wizard를 사용하여 데이터 모델을 생성하거나 업데이트하면 데이터 소스에서 uniqueidentifier 형식의 열에 대해 엔터티 형식의 GUID 속성이 자동으로 생성됩니다. 또한 데이터 소스는 16바이트 이진 열을 사용하여 GUID 값을 저장할 수 있습니다. 도구에서 데이터 소스의 각 이진 열에 대한 이진 속성을 생성하기 때문에 .edmx 파일을 편집하여 이러한 열에서 GUID 속성으로의 매핑을 수동으로 업데이트해야 합니다. 자세한 내용은 How to: Map a GUID Property to a Binary Column을 참조하십시오.

단원 내용

방법: EntityKey 만들기(Entity Framework)

참고 항목

작업

방법: EntityKey 만들기(Entity Framework)

기타 리소스

Entity Data Model Tools