using System.Data;
using System.Threading.Tasks;
namespace brecal.model
{
public abstract class DbEntity
{
///
/// DB primary key
///
public uint Id { get; set; }
///
/// Creation timestamp, if null record is unsaved
///
public DateTime? Created { get; set; }
///
/// Modified timestamp, if null record was never modified
///
public DateTime? Modified { get; set; }
///
/// Set query and cmd parameters for an update query
///
/// CMD created by DB manager
public abstract void SetUpdate(IDbCommand cmd);
///
/// set query and cmd parameters for a create query
///
/// CMD created by DB manager
public abstract void SetCreate(IDbCommand cmd);
///
/// set query and cmd parameters for a delete query
///
/// CMD created by DB manager
public abstract void SetDelete(IDbCommand cmd);
public virtual void SetNonQuery(IDbCommand cmd)
{
// default: do nothing
}
///
/// Each database entity must be able to save itself to the database
///
public async Task Save(IDBManager manager)
{
if (this.Created.HasValue)
{
await manager.ExecuteNonQuery(this.SetUpdate);
}
else
{
this.Id = (uint)await manager.ExecuteNonQuery(this.SetCreate);
}
}
///
/// Each entity must be able to delete itself
///
public async Task Delete(IDBManager manager)
{
await manager.ExecuteNonQuery(this.SetDelete);
}
public async Task ExecuteNonQuery(IDBManager manager)
{
await manager.ExecuteNonQuery(this.SetNonQuery);
}
}
}