using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Transactions; using System; using Church.Net.DAL.EF; using System.Linq; using Church.Net.Utility; using System.Threading.Tasks; using Church.Net.Entity.Interface; using System.ComponentModel.DataAnnotations; using System.Reflection; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore.Metadata.Internal; namespace Church.Net.DAL.EFCoreDBF { public class CrudDALCBase1 : ICrudDAL where T : class, IEntity, new() { private readonly ChurchNetContext dbContext; public CrudDALCBase1(DatabaseOptions databaseOptions) { this.dbContext = databaseOptions.GetDbContext(); InitKeyProperty(); } public IQueryable GetDbSet() { //var result = (DbSet)typeof(ChurchNetContext).GetMethod("Set").MakeGenericMethod(typeof(T)).Invoke(dbContext, null); return dbContext.Set().AsNoTracking(); //return result; } public virtual T First(Func filter = null) { return GetDbSet().Where(filter ?? (s => true)).FirstOrDefault(); } public virtual T GetById(string Id) { return this.GetQuery(new string[] { Id }).FirstOrDefault(); } //public virtual T GetByRefndx(string refndx) //{ // return MapDBModelToEntity(GetFirstDBModelByRefndx(refndx, this.actionScreen)); //} public virtual IEnumerable GetAll(Func filter = null) { //var dbObjs = GetDbSet().ToArray(); //IEnumerable list = GetDbSet().Where(filter ?? (s => true)).ToList(); return GetDbSet().AsNoTracking().Where(filter ?? (s => true)).ToList(); } public virtual int Create(T entity) { this.CheckKeyIsEmpty(entity); this.ConvertUTCTime(entity); dbContext.Add(entity); return dbContext.SaveChanges(); } public virtual Task CreateAsync(T entity) { this.CheckKeyIsEmpty(entity); this.ConvertUTCTime(entity); dbContext.Add(entity); //CreateDone(entity, newDbObj); return dbContext.SaveChangesAsync(); } public int CreateOrUpdate(T entity) { int result = 0; this.ConvertUTCTime(entity); if (CheckExist(entity)) { result = this.Update(entity); } else { result = this.Create(entity); } return result; } public virtual int Update(T entity) { //if (!this.CheckExist(entity)) //{ // throw new ArgumentNullException("the Id is not exist."); //} this.ConvertUTCTime(entity); dbContext.Update(entity); return dbContext.SaveChanges(); } public virtual void CreateDone(T entity) { } public virtual void UpdateDone(T entity) { } public virtual int UpdateRange(IEnumerable entities) { dbContext.UpdateRange(entities); return dbContext.SaveChanges(); } public virtual int Delete(T obj) { dbContext.Remove(obj); return dbContext.SaveChanges(); } public int Delete(Func filter) { var list = GetDbSet().Where(filter).ToList(); foreach (var item in list) { dbContext.Remove(item); } return dbContext.SaveChanges(); } public virtual bool CheckExist(T obj) { //var query = GetDbSet().AsQueryable(); var query = GetAll(); List props = new List(); for (int i = 0; i < keyProps.Count; i++) { var prop = keyProps[i]; props.Add(prop); var value = prop.GetValue(obj)?.ToString(); query = query.Where(e => prop.GetValue(e)?.ToString() == value).ToList(); } return query.Any(); } private void ConvertUTCTime(T entity) { var props = typeof(T).GetProperties(); foreach (var prop in props) { if (prop.PropertyType == typeof(DateTime)) { //do stuff like prop.SetValue(t, DateTime.Now, null); DateTime utcTime = ((DateTime)prop.GetValue(entity)).ToUniversalTime(); prop.SetValue(entity, utcTime, null); } } } private List keyProps; protected virtual void InitKeyProperty() { keyProps = typeof(T).GetProperties().Where( prop => Attribute.IsDefined(prop, typeof(KeyAttribute))).OrderBy(prop => prop.GetCustomAttribute().Order ) .ToList(); } protected IQueryable GetQuery(IEnumerable Ids) { var query = GetDbSet().AsQueryable(); for (int i = 0; i < keyProps.Count; i++) { query = query.Where(e => keyProps[i].GetValue(e).ToString() == Ids.ElementAt(i)); } return query; } protected virtual void CheckKeyIsEmpty(T entity) { if (string.IsNullOrWhiteSpace(entity.Id) || entity.Id.Length <= 3) { entity.Id = StringHelper.Get33BaseGuid(); } } public void Dispose() { throw new NotImplementedException(); } public IEnumerable GetAllById(IEnumerable Ids) { throw new NotImplementedException(); } } }