런타임의 개체에는 고유한 ID가 있습니다. 동일한 개체를 참조하는 두 변수는 실제로 개체의 동일한 인스턴스를 참조합니다. 이 때문에 한 변수를 통해 경로를 통해 변경한 내용이 다른 변수를 통해 즉시 표시됩니다.
관계형 데이터베이스 테이블의 행에는 고유 ID가 없습니다. 각 행에는 고유한 기본 키가 있으므로 두 행이 동일한 키 값을 공유하지 않습니다. 그러나 이 사실은 데이터베이스 테이블의 내용만 제한합니다.
실제로 데이터는 데이터베이스에서 애플리케이션이 작동하는 다른 계층으로 가져오는 경우가 가장 많습니다. LINQ to SQL에서 지원하는 모델입니다. 데이터를 데이터베이스에서 행으로 가져오는 경우 동일한 데이터를 나타내는 두 개의 행이 실제로 동일한 행 인스턴스에 해당한다는 것을 예상할 수 없습니다. 특정 고객을 두 번 쿼리하면 두 행의 데이터가 표시됩니다. 각 행에는 동일한 정보가 포함됩니다.
개체를 다룰 때는 전혀 다른 것을 기대하게 됩니다. 동일한 정보를 반복적으로 요청하는 DataContext 경우 실제로 동일한 개체 인스턴스가 제공될 것으로 예상합니다. 개체는 애플리케이션에 특별한 의미가 있고 개체처럼 동작할 것으로 예상하기 때문에 이 동작이 예상됩니다. 이를 계층 또는 그래프로 디자인했습니다. 동일한 항목을 두 번 이상 요청해도 다수의 복제된 인스턴스를 받는 것이 아니라, 요청한 항목 그대로 검색할 수 있을 것으로 기대합니다.
LINQ to SQL DataContext 에서 개체 ID를 관리합니다. 데이터베이스에서 새 행을 검색할 때마다 행이 기본 키로 ID 테이블에 기록되고 새 개체가 만들어집니다. 동일한 행을 검색할 때마다 원래 개체 인스턴스가 애플리케이션에 다시 전달됩니다. 이러한 방식으로 DataContext 데이터베이스에서 볼 수 있는 ID 개념(즉, 기본 키)을 언어(즉, 인스턴스)에서 볼 수 있는 ID 개념으로 변환합니다. 애플리케이션은 개체가 처음 검색된 상태의 개체만 볼 수 있습니다. 새 데이터가 다른 경우 삭제됩니다. 자세한 내용은 ID 캐시에서 개체 검색을 참조하세요.
LINQ to SQL은 낙관적 업데이트를 지원하기 위해 이 방법을 사용하여 로컬 개체의 무결성을 관리합니다. 개체를 처음 만든 후에 발생하는 유일한 변경 내용은 애플리케이션에서 수행한 변경 내용뿐이므로 애플리케이션의 의도는 명확합니다. 중간에 외부 당사자의 변경이 발생한 경우 해당 변경 내용이 호출될 때 SubmitChanges()
식별됩니다.
비고
쿼리에서 요청한 개체를 이미 검색된 개체로 쉽게 식별할 수 있는 경우 쿼리가 실행되지 않습니다. ID 테이블은 이전에 검색된 모든 개체의 캐시 역할을 합니다.
예시
개체 캐싱 예제 1
이 예제에서는 동일한 쿼리를 두 번 실행하는 경우 매번 메모리에서 동일한 개체에 대한 참조를 받습니다.
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();
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()
개체 캐싱 예제 2
이 예제에서는 데이터베이스에서 동일한 행을 반환하는 다른 쿼리를 실행하는 경우 매번 메모리에서 동일한 개체에 대한 참조를 받습니다.
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;
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