¿Cuál es la lógica detrás del método SaveChanges de EF?
Cuando inserto un nuevo elemento en un DBSet, como este:
var newItemAdded = MyDBSet.Add(itemToAdd);
Luego guardo los cambios en la base de datos así:
MyContext.SaveChanges();
Mi variable newItemAdded
ha sido actualizada con el nuevo Id generado automáticamente por la base de datos.
Fui a EF Core Github para ver la lógica, pero con la gran cantidad de archivos en el repositorio, no estoy seguro de entender la lógica detrás.
Mi preocupación es más sobre cómo el método SaveChanges
ejecutado después de la inserción puede actualizar newItemAdded
. EF no parece usar ref
.
¿Quizás alguien ya sabe cómo funciona?
Gracias.
davy.ai
Cuando se agrega un nuevo elemento a un
DBSet
usandoMyDBSet.Add(itemToAdd)
, en realidad no se guarda inmediatamente en la base de datos. En su lugar, se agrega a una colección en memoria de entidades que serán guardadas en la base de datos cuando se llame aMyContext.SaveChanges()
.Cuando se ejecuta
SaveChanges()
, EF Core genera comandos SQL para insertar la nueva entidad en la base de datos. Después de que la inserción tiene éxito, EF Core recupera el valor de ID auto-generado desde la base de datos y actualiza la propiedad correspondiente en la entidad recién insertada.Dado que
newItemAdded
es una referencia a esta entidad, su propiedad de ID también se actualiza con el nuevo valor. Esto no se realiza a través del uso deref
, sino a través del hecho de quenewItemAdded
y la entidad en memoria apuntan al mismo objeto en memoria.La lógica para esto se puede encontrar en el método
Add
dentro de la claseInternalDbSet
en el código fuente de EF Core. Específicamente, el código que establece la propiedad de ID de la entidad recién insertada se puede encontrar dentro del métodoSaveChanges
dentro de la claseDbContext
.Espero que esto aclare cómo EF Core actualiza la propiedad de ID de una entidad recién insertada y cómo está relacionada con la variable que la referencia.