다음을 통해 공유


개체 ID(LINQ to SQL)

업데이트: November 2007

런타임의 개체는 고유한 ID를 가집니다. 동일한 개체를 참조하는 두 개의 변수는 실제로 해당 개체의 동일한 인스턴스를 참조합니다. 따라서 하나의 변수를 통해 수행한 변경 내용을 다른 변수를 통해 즉시 볼 수 있습니다.

관계형 데이터베이스 테이블의 행에는 고유한 ID가 없습니다. 각 행에 고유한 기본 키가 있으므로 두 개 행이 동일한 키 값을 공유하지 않습니다. 그러나 데이터베이스 테이블의 콘텐츠에만 이 제한이 적용됩니다.

실제로는 응용 프로그램이 데이터를 사용하는 다른 계층으로 데이터베이스의 데이터를 가져오는 경우가 가장 일반적입니다. 이는 LINQ to SQL에서 지원하는 모델입니다. 데이터를 데이터베이스에서 행으로 가져올 때 동일한 데이터를 나타내는 두 개의 행이 실제로 동일한 행 인스턴스에 해당하지 않습니다. 특정 고객을 두 번 쿼리할 경우 두 개의 데이터 행을 얻게 되며 각 행은 동일한 정보를 포함합니다.

개체의 경우 전혀 다른 결과가 발생합니다. DataContext에 동일한 정보를 반복해서 요청할 경우 실제로 동일한 개체 인스턴스가 제공될 것입니다. 개체가 응용 프로그램에 대해 특별한 의미를 가지며 동일한 개체로 작동할 것으로 예상되므로 이 동작이 발생합니다. 개체를 계층 구조나 그래프로 디자인하고 동일한 항목을 여러 번 요청했으면 개체는 이와 같이 검색되고 중복된 많은 인스턴스가 제공되지 않습니다.

LINQ to SQL에서 DataContext는 개체 ID를 관리합니다. 데이터베이스에서 새 행을 검색할 때마다 해당 기본 키별로 ID 테이블에 행이 기록되고 새 개체가 만들어집니다. 동일한 해당 행을 검색할 때마다 원래 개체 인스턴스가 응용 프로그램에 다시 전달됩니다. 이와 같은 방식으로 DataContext는 데이터베이스에 인식하는 ID의 개념(즉, 기본 키)을 언어에서 인식하는 ID의 개념(즉, 인스턴스)으로 변환합니다. 응용 프로그램은 처음 검색된 상태로만 개체를 봅니다. 새 데이터는 다를 경우 삭제됩니다.

LINQ to SQL은 낙관적 업데이트를 지원하기 위해 이 방법을 사용하여 로컬 개체의 무결성을 관리합니다. 개체가 처음 만들어진 후에 발생한 변경만 응용 프로그램에 의해 수행된 변경이므로 응용 프로그램에서 의도하는 바를 분명히 알 수 있습니다. 도중에 외부로부터 변경이 발생한 경우에는 SubmitChanges()가 호출될 때 해당 변경 내용이 식별됩니다.

참고:

쿼리에 의해 요청된 개체를 이미 검색된 개체로 쉽게 식별할 수 있는 경우 쿼리가 실행되지 않습니다. ID 테이블은 이전에 검색된 모든 개체의 캐시로 작동합니다.

예제

개체 캐싱 예제 1

이 예제에서는 동일한 쿼리를 두 번 실행할 경우 항상 메모리의 동일한 개체에 대한 참조가 수신됩니다.

Dim cust1 As Customer = _
    (From cust In db.Customers _
    Where cust.CustomerID = "BONAP" _
    Select cust).First()

Dim cust2 As Customer = _
    (From cust In db.Customers _
    Where cust.CustomerID = "BONAP" _
    Select cust).First()
Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

개체 캐싱 예제 2

이 예제에서는 데이터베이스에서 동일한 행을 반환하는 다른 쿼리를 실행할 경우 항상 메모리의 동일한 개체에 대한 참조가 수신됩니다.

Dim cust1 As Customer = _
    (From cust In db.Customers _
    Where cust.CustomerID = "BONAP" _
    Select cust).First()

Dim cust2 As Customer = _
    (From ord In db.Orders _
    Where ord.Customer.CustomerID = "BONAP" _
    Select ord).First().Customer
Customer cust1 =
    (from cust in db.Customers
     where cust.CustomerID == "BONAP"
     select cust).First();

Customer cust2 =
    (from ord in db.Orders
     where ord.Customer.CustomerID == "BONAP"
     select ord).First().Customer;

참고 항목

기타 리소스

배경 정보(LINQ to SQL)