using System.Diagnostics.CodeAnalysis; namespace Pilz.Net.Data; public abstract class DataManager : IDataManager { protected abstract void UpdateEntity(T obj) where T : IDataObject; protected abstract IQueryable GetEntitySet() where T : IDataObject; protected abstract T? FindEntity(int id) where T : IDataObject; protected abstract void RemoveEntity(T obj) where T : IDataObject; protected abstract void SaveChanges(); public virtual IQueryable Get() where T : IDataObject { return GetEntitySet(); } public virtual T FindOrNew(int? id) where T : IDataObject { if (Find(id) is not T obj) obj = Activator.CreateInstance(); return obj; } public virtual T FindOrNew(int id) where T : IDataObject { if (Find(id) is not T obj) obj = Activator.CreateInstance(); return obj; } public virtual T? FindOrNull(int? id) where T : IDataObject { if (id == null || id == 0) return default; return Find(id); } public virtual T? FindOrNull(int id) where T : IDataObject { if (id == 0) return default; return Find(id); } public virtual T? Find(int? id) where T : IDataObject { if (id == null) return default; return Find(id.Value); } public virtual T? Find(int id) where T : IDataObject { return FindEntity(id); } public virtual bool FindOrNew(int? id, [NotNullWhen(true)] out T? obj) where T : IDataObject { if (id == null || id == 0) { obj = Activator.CreateInstance(); return obj != null; } return Find(id.Value, out obj); } public virtual bool FindOrNew(int id, [NotNullWhen(true)] out T? obj) where T : IDataObject { if (id == 0) { obj = Activator.CreateInstance(); return obj != null; } return Find(id, out obj); } public virtual bool FindOrNull(int? id, out T? obj) where T : IDataObject { if (id == null || id == 0) { obj = default; return true; } return Find(id.Value, out obj); } public virtual bool FindOrNull(int id, out T? obj) where T : IDataObject { if (id == 0) { obj = default; return true; } return Find(id, out obj); } public virtual bool Find(int id, [NotNullWhen(true)] out T? obj) where T : IDataObject { if (FindEntity(id) is not T t) { obj = default; return false; } obj = t; return true; } public virtual void Delete(int id) where T : IDataObject { Delete(id, false); } public virtual void Delete(int id, bool save) where T : IDataObject { if (Find(id, out T? obj)) Delete(obj, save); } public virtual void Delete(T? obj) where T : IDataObject { Delete(obj, false); } public virtual void Delete(T? obj, bool save) where T : IDataObject { if (obj != null) { RemoveEntity(obj); if (save) Save(); } } public virtual void Save(T obj) where T : IDataObject { Save(obj, false); } public virtual void Save(T obj, bool save) where T : IDataObject { UpdateEntity(obj); if (save) Save(); } public virtual void Save() { SaveChanges(); } }