コード例 #1
0
        public int SaveChanges(string userId)
        {
            //Update Modified and ModifiedById For BaseModel classes
            IEnumerable <DbEntityEntry> entries = ChangeTracker.Entries().Where(x => x.Entity is BaseModel && (x.State == EntityState.Added || x.State == EntityState.Modified));

            foreach (DbEntityEntry entry in entries)
            {
                DateTime datetime = DateTime.Now;
                ((BaseModel)entry.Entity).Modified     = datetime;
                ((BaseModel)entry.Entity).ModifiedById = userId;

                if (entry.State == EntityState.Added)
                {
                    WellTableModel wellTableModel = ((BaseModel)entry.Entity).WellTable;
                    if (wellTableModel != null && entry.Property(wellTableModel.IdField).CurrentValue == null)
                    {
                        entry.Property(wellTableModel.IdField).CurrentValue = ((BaseModel)entry.Entity).GetWellId();
                    }
                    ((BaseModel)entry.Entity).Created     = datetime;
                    ((BaseModel)entry.Entity).CreatedById = userId;
                }
                else
                {
                    entry.Property("Created").IsModified     = false;
                    entry.Property("CreatedById").IsModified = false;
                }
            }

            //Update Id for BaseBaseModel classes
            IEnumerable <DbEntityEntry> idEntries = ChangeTracker.Entries().Where(x => x.Entity is BaseBaseModel && (x.State == EntityState.Added));

            foreach (DbEntityEntry entry in idEntries)
            {
                WellTableModel wellTableModel = ((BaseBaseModel)entry.Entity).WellTable;
                if (wellTableModel != null && entry.Property(wellTableModel.IdField).CurrentValue == null)
                {
                    entry.Property(wellTableModel.IdField).CurrentValue = ((BaseBaseModel)entry.Entity).GetWellId();
                }
            }

            //Set IsModified = false for readonly Properties
            IEnumerable <DbEntityEntry> readOnlyEntries = ChangeTracker.Entries().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified);

            foreach (DbEntityEntry entry in readOnlyEntries)
            {
                var currentValues = entry.CurrentValues;
                if (currentValues != null)
                {
                    foreach (string propertyName in currentValues.PropertyNames)
                    {
                        if (entry.Entity.GetType().GetProperty(propertyName).GetCustomAttribute(typeof(TFOF.Areas.Core.Attributes.ReadOnlyAttribute)) != null)
                        {
                            entry.Property(propertyName).IsModified = false;
                        }
                    }
                }
            }

            //Record Changes
            AuditModelContext recentUpdateDb = AuditChanges(ChangeTracker, userId);

            //Records need to be saved first before audit
            try
            {
                int affected = base.SaveChanges();
                recentUpdateDb.SaveChanges(userId);
                return(affected);
            }
            catch (DbEntityValidationException ex)
            {
                foreach (var entryError in ex.EntityValidationErrors)
                {
                    foreach (var error in entryError.ValidationErrors)
                    {
                        throw new DbEntityValidationException(
                                  "Entity Validation Failed for " + error.PropertyName + ": " +
                                  error.ErrorMessage
                                  );               // Add the original exception as the inn
                    }
                }
            }
            return(0);
        }