Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los objetos del tiempo de ejecución tienen identidades únicas. Dos variables que hacen referencia al mismo objeto hacen referencia realmente a la misma instancia del objeto. Debido a este hecho, los cambios que realices por medio de una ruta a través de una variable son visibles inmediatamente en la otra.
Las filas de una tabla de base de datos relacional no tienen identidades únicas. Dado que cada fila tiene una clave principal única, no hay dos filas que compartan el mismo valor de clave. Sin embargo, este hecho restringe solo el contenido de la tabla de base de datos.
En realidad, los datos suelen sacarse de la base de datos a un nivel diferente, donde una aplicación funciona con ellos. Este es el modelo que admite LINQ to SQL. Cuando los datos se sacan de la base de datos como filas, no se espera que dos filas que representen los mismos datos se correspondan realmente con las mismas instancias de fila. Si consulta un cliente específico dos veces, obtendrá dos filas de datos. Cada fila contiene la misma información.
Con objetos se espera algo muy diferente. Se espera que, si se solicita la misma información a DataContext varias veces, de hecho se obtendrá la misma instancia de objeto. Espera este comportamiento porque los objetos tienen un significado especial para la aplicación y espera que se comporten como objetos. Los diseñó como jerarquías o gráficos. Lo que se espera es que se recuperarán como tales y no que se recibirán múltiples instancias replicadas sólo porque se solicitó lo mismo más de una vez.
En LINQ to SQL, el DataContext administra la identidad del objeto. Cada vez que recupere una nueva fila de la base de datos, la fila se registra en una tabla de identidad mediante su clave principal y se crea un nuevo objeto. Siempre que recupere esa misma fila, la instancia de objeto original se devuelve a la aplicación. De esta manera, DataContext traduce el concepto de identidad tal como lo ve la base de datos (es decir, las claves principales) en el concepto de identidad visto por el lenguaje (es decir, instancias). La aplicación solo ve el objeto en el estado que se recuperó por primera vez. Los nuevos datos, si son diferentes, se descartan. Para obtener más información, vea Recuperar objetos de la caché de identidades.
LINQ to SQL usa este enfoque para administrar la integridad de los objetos locales con el fin de admitir actualizaciones optimistas. Dado que los únicos cambios que se producen después de crear el objeto son los realizados por la aplicación, la intención de la aplicación es clara. Si en ese período de tiempo un tercero ha realizado cambios, se identifican en el momento en que se llama a SubmitChanges()
.
Nota:
Si el objeto solicitado por la consulta se identifica fácilmente como uno ya recuperado, no se ejecuta ninguna consulta. La tabla de identidad actúa como una memoria caché de todos los objetos recuperados anteriormente.
Ejemplos
Ejemplo 1 de almacenamiento en caché de objetos
En este ejemplo, si ejecuta la misma consulta dos veces, recibirá una referencia al mismo objeto en memoria cada vez.
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()
Ejemplo 2 de almacenamiento en caché de objetos
En este ejemplo, si ejecuta consultas diferentes que devuelven la misma fila de la base de datos, recibirá una referencia al mismo objeto en memoria cada vez.
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