using CAPI.Custom.Data; using CAPI.Custom.Entities; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Validation; using System.Linq; namespace CAPI.Custom.Services { public abstract class EntityReadOnlyService : IDisposable where TContext : DbContext, new() where TEntity : class { protected TContext db = new TContext(); public virtual IQueryable Entities => db.Set(); public virtual TEntity Find(object recId) => db.Set().Find(recId); public virtual void Dispose() { db.SaveChanges(); Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { if (db != null) { db.Dispose(); db = null; } } } } public abstract class EntityServiceBase : EntityReadOnlyService where TContext : DbContext, new() where TEntity : class { /// /// Mark entity as Added - Applies on Save() /// /// public virtual void Add(TEntity entity) { db.Set().Add(entity); } /// /// Mark entity as Deleted - Applies on Save() /// /// public virtual void Remove(TEntity entity) { db.Set().Remove(entity); } /// /// Mark entity as Edited - Applies on Save() /// /// public virtual void Edit(TEntity entity) { db.Entry(entity).State = EntityState.Modified; } /// /// Apply changes /// /// public virtual int Save() { try { return db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { //Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); dbEx.Data.Add(validationError.PropertyName, validationError); System.Diagnostics.Debugger.Break(); //return; } } throw; } } } public class EntityService : EntityServiceBase where TEntity : class, IEntity { public EntityService() { this.db = QuotesContext.Create(); } /// /// Create entity immediately /// /// /// public virtual TEntity Create(TEntity entity) => db.Create(entity); /// /// Create multiple entities immediately /// /// /// public virtual IEnumerable Create(IEnumerable entities) => db.Create(entities); /// /// Update entity immediately /// /// /// /// public virtual TEntity Update(TEntity entity) => db.Update(entity); /// /// Update multiple entities immediately /// /// /// public virtual IEnumerable Update(IEnumerable entities) => db.Update(entities); /// /// Delete entity immediately /// /// /// public virtual int Delete(TEntity entity) => db.Delete(entity); /// /// Delete multiple entities immediately /// /// /// public virtual int Delete(IEnumerable entities) => db.Delete(entities); } public class SurfaceItemService : EntityService where TSurfaceItem : class, ISurfaceEntity { public virtual TSurfaceItem GetByItemId(int itemId) => Entities.FirstOrDefault(p => p.itemID == itemId); public virtual IQueryable GetChildren(int parentId) where TChildItem : class, ISurfaceChildEntity { return db.Set().GetByParentId(parentId); } } public class SurfaceChildItemService : SurfaceItemService where TSurfaceChildItem : class, ISurfaceChildEntity { public virtual IQueryable GetByParentId(int parentId) => db.Set().Where(p => p.ParentSurfaceItemId == parentId); public virtual TParentSurfaceItem GetParent(TSurfaceChildItem childItem) where TParentSurfaceItem : class, ISurfaceEntity { return db.Set().FirstOrDefault(p => p.itemID == childItem.ParentSurfaceItemId); } } public class ViewService : EntityReadOnlyService where TView : class, IViewEntity { } public class SurfaceItemViewService : ViewService where TView : class, IViewEntity, ISurfaceEntity { public virtual TView GetByItemId(int itemId) => Entities.FirstOrDefault(p => p.itemID == itemId); } public class SurfaceChildItemViewService : SurfaceItemViewService where TView : class, IViewEntity, ISurfaceChildEntity { public virtual IQueryable GetByParentId(int parentId) => db.Set().Where(p => p.ParentSurfaceItemId == parentId); } }