Rutas
/
C#
C#
/
Ejercicios
/
Mapeo objeto-relacional
Mapeo objeto-relacional

Mapeo objeto-relacional

Ejercicio de aprendizaje

Introducción

Limpieza de recursos

Si una clase implementa la interfaz IDisposable, su método Dispose() debe llamarse siempre que una instancia ya no sea necesaria. Normalmente, esto se hace desde una cláusula catch o finally, o desde la rutina Dispose() de algún llamador. Dispose() ofrece la oportunidad de liberar recursos no administrados, como objetos del sistema operativo (que no están administrados por el entorno de ejecución de .NET) y de restablecer el estado interno de los recursos administrados.

Instrucciones

Estás implementando un sistema ORM (mapeo objeto-relacional) sobre una base de datos que ha proporcionado otro equipo.

La base de datos es capaz de gestionar una sola transacción a la vez.

En esta fase no se necesita ningún tipo de registro ni otro manejo de errores.

Ten en cuenta que, internamente, la base de datos pasa por varios estados: Closed, TransactionStarted, DataWritten, Invalid, Closed. Puedes dar por hecho que la base de datos está en un estado Closed al comienzo de cada ejercicio.

La base de datos tiene los siguientes métodos de instancia:

  • Database.BeginTransaction() inicia una transacción en la base de datos. Si se llama cuando la base de datos no está en un estado Closed, se lanza una excepción. Si tiene éxito, el estado interno de la base de datos cambiará a TransactionStarted.
  • Database.Write(string data) escribe datos en la base de datos dentro de la transacción. Si recibe datos incorrectos, se lanzará una excepción. Un intento de llamar a este método sin que se haya llamado antes a BeginTransaction() provocará que se lance una excepción. Si tiene éxito, el estado interno de la base de datos cambiará a DataWritten.
  • Database.EndTransaction() confirma la transacción en la base de datos. Puede lanzar una excepción si no puede cerrar la transacción o si no se ha llamado a Database.BeginTransaction().
  • Una llamada a Database.Dispose() limpiará la base de datos si se lanza una excepción durante una transacción. Esto cambiará el estado de la base de datos a Closed.

Se puede acceder al estado de la base de datos mediante database.DbState.

El estado de la base de datos se puede establecer en uno de los siguientes:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. Iniciar una transacción

Implementa Orm.Begin() para iniciar una transacción en la base de datos. Si la base de datos no empieza con un estado interno State.Closed, se lanza una InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted

2. Escribir datos en la base de datos

Implementa Orm.Write() para escribir datos en la base de datos. Si la base de datos no empieza con un estado interno State.TransactionStarted o se escriben datos incorrectos, se lanza una InvalidOperationException. Si la escritura falla, el Orm debe limpiar la base de datos.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed

3. Confirmar en la base de datos los datos escritos previamente

Implementa Orm.Commit() para confirmar los datos. Si la confirmación falla, limpia la base de datos. Si la base de datos no empieza con un estado interno State.DataWritten, se lanza una InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed

4. Asegurarte de que la base de datos se limpia correctamente si el ORM tiene que cerrarse a mitad de una transacción

Implementa la interfaz IDisposable en la clase Orm. Se garantiza que la llamada tendrá éxito.

var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
C# Exercism

¿Listo para empezar Mapeo objeto-relacional?

Regístrate en Exercism para aprender y dominar C# con 62 conceptos178 ejercicios y mentoría humana real, todo gratis.