internal void RegisterKeyValueForAddedEntity(IEntityStateEntry addedEntry)
        {
            EntityKey entityKey = addedEntry.EntityKey;
            ReadOnlyMetadataCollection <EdmMember> keyMembers = addedEntry.EntitySet.ElementType.KeyMembers;
            CurrentValueRecord currentValues = addedEntry.CurrentValues;

            object[] compositeKeyValues = new object[keyMembers.Count];
            bool     flag  = false;
            int      index = 0;

            for (int count = keyMembers.Count; index < count; ++index)
            {
                int ordinal = currentValues.GetOrdinal(keyMembers[index].Name);
                if (currentValues.IsDBNull(ordinal))
                {
                    flag = true;
                    break;
                }
                compositeKeyValues[index] = currentValues.GetValue(ordinal);
            }
            if (flag)
            {
                return;
            }
            EntityKey key = compositeKeyValues.Length == 1 ? new EntityKey(addedEntry.EntitySet, compositeKeyValues[0]) : new EntityKey(addedEntry.EntitySet, compositeKeyValues);

            if (this._valueKeyToTempKey.ContainsKey(key))
            {
                this._valueKeyToTempKey[key] = (EntityKey)null;
            }
            else
            {
                this._valueKeyToTempKey.Add(key, entityKey);
            }
        }
        public static void ResetProperties(
            this ObjectContext oc,
            object targetObject)
        {
            EntityType entityType = oc.MetadataWorkspace.GetItem <EntityType>(
                targetObject.GetType().FullName,
                DataSpace.CSpace);

            ObjectStateEntry objectStateEntry = oc
                                                .ObjectStateManager
                                                .GetObjectStateEntry(targetObject);

            CurrentValueRecord currentValues = objectStateEntry.CurrentValues;

            object dummy = Activator.CreateInstance(targetObject.GetType());

            foreach (EdmProperty p in entityType.Properties.Where(x => x.IsPrimitiveType || x.IsComplexType))
            {
                bool isKey = entityType.KeyProperties.Any(x => x.Name == p.Name);

                if (!isKey)
                {
                    object v = ReflectionHelper.GetProperty(dummy, p.Name);
                    int    propertyOrdinal = currentValues.GetOrdinal(p.Name);
                    currentValues.SetValue(propertyOrdinal, v);
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Checks to see if the specified <see cref="EntityObject"/> has modified properties.
        /// If all properties have the same values, set the state to Unchanged.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="entity">The entity.</param>
        public static void CheckIfModified(this ObjectContext context, EntityObject entity)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            if (entity.EntityState == EntityState.Modified)
            {
                ObjectStateEntry   state          = context.ObjectStateManager.GetObjectStateEntry(entity);
                DbDataRecord       originalValues = state.OriginalValues;
                CurrentValueRecord currentValues  = state.CurrentValues;

                for (int i = 0; i < originalValues.FieldCount; i++)
                {
                    object original = originalValues.GetValue(i);
                    object current  = currentValues.GetValue(i);
                    if (!original.Equals(current))// && (!(original is byte[]) || !((byte[])original).SequenceEqual((byte[])current)))
                    {
                        // Something has actually changed.  We can return now.
                        return;
                    }
                }

                // We made it through the loop without finding any changed properties
                state.ChangeState(EntityState.Unchanged);
            }
        }
        private PropagatorResult CreateSimpleResult(
            IEntityStateEntry stateEntry,
            IExtendedDataRecord record,
            ExtractorMetadata.MemberInformation memberInformation,
            int identifier,
            bool isModified,
            int recordOrdinal,
            object value)
        {
            CurrentValueRecord record1 = record as CurrentValueRecord;
            PropagatorFlags    flags   = memberInformation.Flags;

            if (!isModified)
            {
                flags |= PropagatorFlags.Preserve;
            }
            if (-1 != identifier)
            {
                PropagatorResult owner = !memberInformation.IsServerGenerated && !memberInformation.IsForeignKeyMember || record1 == null?PropagatorResult.CreateKeyValue(flags, value, stateEntry, identifier) : PropagatorResult.CreateServerGenKeyValue(flags, value, stateEntry, identifier, recordOrdinal);

                this.m_translator.KeyManager.RegisterIdentifierOwner(owner);
                return(owner);
            }
            if ((memberInformation.IsServerGenerated || memberInformation.IsForeignKeyMember) && record1 != null)
            {
                return(PropagatorResult.CreateServerGenSimpleValue(flags, value, record1, recordOrdinal));
            }
            return(PropagatorResult.CreateSimpleValue(flags, value));
        }
Exemple #5
0
        private string GetEntryValueInString(ObjectStateEntry entry, bool isOrginal)
        {
            StringBuilder sb = new StringBuilder();

            foreach (string propertyName in entry.GetModifiedProperties())
            {
                DbDataRecord       original = entry.OriginalValues;
                CurrentValueRecord current  = entry.CurrentValues;
                //if (original.GetValue(original.GetOrdinal(propertyName)).ToString() != current.GetValue(current.GetOrdinal(propertyName)).ToString())
                //{
                if (isOrginal)
                {
                    sb.Append(String.Format("Property:{0} Value:{1} /", propertyName, original.GetValue(original.GetOrdinal(propertyName)).ToString()));
                }
                else
                {
                    sb.Append(String.Format("Property:{0} Value:{1} /", propertyName, current.GetValue(current.GetOrdinal(propertyName)).ToString()));
                }
                //}
            }
            return(sb.ToString());

            //if (entry.Entity is EntityObject)
            //{
            //    object target = CloneEntity((EntityObject)entry.Entity);
            //    foreach (string propName in entry.GetModifiedProperties())
            //    {
            //        object setterValue = null;
            //        if (isOrginal)
            //        {
            //            //Get orginal value
            //            setterValue = entry.OriginalValues[propName];
            //        }
            //        else
            //        {
            //            //Get orginal value
            //            setterValue = entry.CurrentValues[propName];
            //        }
            //        //Find property to update
            //        PropertyInfo propInfo = target.GetType().GetProperty(propName);
            //        //update property with orgibal value
            //        if (setterValue == DBNull.Value)
            //        {//
            //            setterValue = null;
            //        }
            //        propInfo.SetValue(target, setterValue, null);
            //    }//end foreach

            //    XmlSerializer formatter = new XmlSerializer(target.GetType());
            //    XDocument document = new XDocument();

            //    using (XmlWriter xmlWriter = document.CreateWriter())
            //    {
            //        formatter.Serialize(xmlWriter, target);
            //    }
            //    return document.Root.ToString();
            //}
            //return null;
        }
Exemple #6
0
 internal static PropagatorResult CreateServerGenSimpleValue(
     PropagatorFlags flags,
     object value,
     CurrentValueRecord record,
     int recordOrdinal)
 {
     return((PropagatorResult) new PropagatorResult.ServerGenSimpleValue(flags, value, record, recordOrdinal));
 }
            internal ServerGenSimpleValue(PropagatorFlags flags, object value, CurrentValueRecord record, int recordOrdinal)
                : base(flags, value)
            {
                DebugCheck.NotNull(record);

                m_record        = record;
                m_recordOrdinal = recordOrdinal;
            }
        private void SetAddedProperties(ObjectStateEntry entry, StringBuilder newData)
        {
            CurrentValueRecord currentValues = entry.CurrentValues;

            for (int i = 0; i < currentValues.FieldCount; i++)
            {
                newData.AppendFormat("{0}={1} || ", currentValues.GetName(i), currentValues.GetValue(i));
            }
        }
        public override void Hook(IIdentifiable entity, HookEntityMetadata metadata)
        {
            //// Check is auditable context, contains auditlog table
            IAuditableContext context = metadata.CurrentContext as IAuditableContext;

            if (context == null)
            {
                return;
            }

            //// Get current username
            var userName = "******";

            if (this.HttpContext != null)
            {
                userName = this.HttpContext.User.Identity.Name;
            }

            //// Get entry, entity type and associate etadata
            var entry      = ((IObjectContextAdapter)metadata.CurrentContext).ObjectContext.ObjectStateManager.GetObjectStateEntry(entity);
            var entityType = entity.GetType();

            TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(entityType), entityType);

            //// Get is entity modified property contains requireAudit Field, and add auditlog
            var properties = TypeDescriptor.GetProperties(entityType);

            foreach (string propertyName in entry.GetModifiedProperties())
            {
                //// Check is property need io
                var propertyDescriptor = properties.Find(propertyName, true);
                var propRequireAudit   = propertyDescriptor.Attributes.OfType <RequireAuditAttribute>().FirstOrDefault();
                if (propRequireAudit == null)
                {
                    continue;
                }

                //// Get original value
                DbDataRecord original = entry.OriginalValues;
                string       oldValue = original.GetValue(original.GetOrdinal(propertyName)).ToString();

                //// Get new value
                CurrentValueRecord current  = entry.CurrentValues;
                string             newValue = current.GetValue(current.GetOrdinal(propertyName)).ToString();

                //// Write Audit Log
                AuditLog auditLog = new AuditLog();
                auditLog.IdentifyKey  = entity.IdentifyKey;
                auditLog.IdentifyName = entityType.Name;
                auditLog.OriginValue  = oldValue;
                auditLog.NewValue     = newValue;
                auditLog.CreatedAt    = DateTime.Now;
                auditLog.CreatedBy    = userName;

                context.AuditLogs.Add(auditLog);
            }
        }
Exemple #10
0
 internal ServerGenSimpleValue(
     PropagatorFlags flags,
     object value,
     CurrentValueRecord record,
     int recordOrdinal)
     : base(flags, value)
 {
     this.m_record        = record;
     this.m_recordOrdinal = recordOrdinal;
 }
Exemple #11
0
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();

            //EntityState.Added
            foreach (var entry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Added))
            {
                string NewEmplNo, NewEmplName;
                NewEmplNo   = ((Transfer)(entry.Entity)).TransferID;
                NewEmplName = ((Transfer)(entry.Entity)).Description;
                listBox1.Items.Add(String.Format(
                                       "員工代碼{0}為Added,目前的員工名稱:{1} ",
                                       NewEmplNo, NewEmplName));
            }

            //EntityState.Modified
            foreach (var entry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Modified))
            {
                string NewEmplName, OldEmplName, OrginalEmplNo;
                //取得員工名稱目前值
                CurrentValueRecord curr = entry.CurrentValues;
                NewEmplName = (string)(curr.GetValue(curr.GetOrdinal("Description")));
                //取得員工名稱原來值
                OriginalValueRecord org = entry.GetUpdatableOriginalValues();
                OldEmplName   = (string)(org.GetValue(org.GetOrdinal("Description")));
                OrginalEmplNo = ((Transfer)(entry.Entity)).TransferID;
                listBox1.Items.Add(String.Format("員工代碼{0}為Modified, " +
                                                 "目前的員工名稱:{1},原來的員工名稱:{2} ",
                                                 OrginalEmplNo, NewEmplName, OldEmplName));
            }

            //EntityState.Deleted
            foreach (var entry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Deleted))
            {
                string OldEmplNo, OldEmplName;
                OldEmplNo   = ((Transfer)(entry.Entity)).TransferID;
                OldEmplName = ((Transfer)(entry.Entity)).Description;
                listBox1.Items.Add(String.Format("員工代碼{0}為Deleted, " +
                                                 "原來的員工名稱:{1} ", OldEmplNo, OldEmplName));
            }

            //EntityState.Unchanged
            foreach (var entry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Unchanged))
            {
                string currEmplNo, currEmplName;
                currEmplNo   = ((Transfer)(entry.Entity)).TransferID;
                currEmplName = ((Transfer)(entry.Entity)).Description;
                listBox1.Items.Add(String.Format("員工代碼{0}為Unchanged, " +
                                                 "目前的員工名稱:{1} ", currEmplNo, currEmplName));
            }
        }
Exemple #12
0
        internal virtual void SetServerGenValue(object value)
        {
            if (this.RecordOrdinal == -1)
            {
                return;
            }
            CurrentValueRecord record    = this.Record;
            EdmMember          fieldType = record.DataRecordInfo.FieldMetadata[this.RecordOrdinal].FieldType;

            value = value ?? (object)DBNull.Value;
            value = this.AlignReturnValue(value, fieldType);
            record.SetValue(this.RecordOrdinal, value);
        }
        public static void SetValue(
            this ObjectContext oc,
            object target,
            string propertyName,
            object propertyValue)
        {
            ObjectStateEntry objectStateEntry = oc
                                                .ObjectStateManager
                                                .GetObjectStateEntry(target);

            CurrentValueRecord currentValues = objectStateEntry.CurrentValues;
            int propertyOrdinal = currentValues.GetOrdinal(propertyName);

            currentValues.SetValue(propertyOrdinal, propertyValue);
        }
        public static void SaveChanges(ObjectContext objectContext)
        {
            foreach (var entry in
                     objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
            {
                CurrentValueRecord entryValues = entry.CurrentValues;
                if (entry.State == EntityState.Added)
                {
                    if (entry.Entity.GetType().GetProperty("CreatedOn") != null)
                    {
                        entry.Entity.GetType().GetProperty("CreatedOn").SetValue(entry.Entity, DateTime.Now);
                    }

                    if (entry.Entity.GetType().GetProperty("ModifiedOn") != null)
                    {
                        entry.Entity.GetType().GetProperty("ModifiedOn").SetValue(entry.Entity, null);
                    }

                    if (entry.Entity.GetType().GetProperty("ModifiedBy") != null)
                    {
                        entry.Entity.GetType().GetProperty("ModifiedBy").SetValue(entry.Entity, null);
                    }

                    if (entry.Entity.GetType().GetProperty("IsActive") != null)
                    {
                        entry.Entity.GetType().GetProperty("IsActive").SetValue(entry.Entity, true);
                    }
                }

                if (entry.State == EntityState.Modified)
                {
                    if (entry.Entity.GetType().GetProperty("CreatedOn") != null)
                    {
                        entry.RejectPropertyChanges("CreatedOn");
                    }

                    if (entry.Entity.GetType().GetProperty("CreatedBy") != null)
                    {
                        entry.RejectPropertyChanges("CreatedBy");
                    }

                    if (entry.Entity.GetType().GetProperty("ModifiedOn") != null)
                    {
                        entry.Entity.GetType().GetProperty("ModifiedOn").SetValue(entry.Entity, DateTime.Now);
                    }
                }
            }
        }
        void ILedgerObject.LedgerCallback(CurrentValueRecord currentValues, DbDataRecord originalValues, ChangeAction changeAction, DataAccess.EntityFramework.ConcentratorDataContext dataContext, string name)
        {
            ContentLedger ledgerEntry = new ContentLedger();

            ledgerEntry.LedgerObject = name;

            if (OnBeforeLedger != null)
            {
                OnBeforeLedger(ledgerEntry);
            }

            bool insertLedgerEntry = false;

            Ledger(ledgerEntry, changeAction);

            switch (changeAction)
            {
            case ChangeAction.Delete:
                //insertLedgerEntry = LedgerOnDelete(ledgerEntry, dataContext, (LedgerObjectBase)originalObject);
                break;

            case ChangeAction.Insert:
                insertLedgerEntry = LedgerOnInsert(ledgerEntry, dataContext);
                break;

            case ChangeAction.Update:
                insertLedgerEntry = LedgerOnUpdate(ledgerEntry, currentValues, originalValues, dataContext);
                break;

            default:
                throw new ApplicationException(String.Format("Got ChangeAction: {0}. This not a supported action for ledgering", changeAction.ToString()));
            }

            AfterLedger(ledgerEntry, changeAction);

            // Ad hoc issue
            if (OnLedger != null)
            {
                OnLedger(ledgerEntry);
            }

            if (insertLedgerEntry)
            {
                ledgerEntry.LedgerDate = DateTime.Now;
                dataContext.CreateObjectSet <ContentLedger>().AddObject(ledgerEntry);
            }
        }
        public override int SaveChanges()
        {
            ObjectContext context = ((IObjectContextAdapter)this).ObjectContext;

            foreach (ObjectStateEntry entry in
                     (context.ObjectStateManager
                      .GetObjectStateEntries(EntityState.Added | EntityState.Modified)))
            {
                if (!entry.IsRelationship)
                {
                    CurrentValueRecord entryValues = entry.CurrentValues;
                    if (entryValues.GetOrdinal("ModifiedBy") > 0)
                    {
                        HttpContext currentContext = HttpContext.Current;
                        string      userId         = "nazrul";
                        DateTime    now            = DateTime.Now;

                        if (currContext.User.Identity.IsAuthenticated)
                        {
                            if (currentContext.Session["userId"] != null)
                            {
                                userId = (string)currentContext.Session["userId"];
                            }
                            else
                            {
                                userId = UserAuthentication.GetUserId(currentContext.User.Identity.UserCode);
                            }
                        }

                        if (entry.State == EntityState.Modified)
                        {
                            entryValues.SetString(entryValues.GetOrdinal("ModifiedBy"), userId);
                            entryValues.SetDateTime(entryValues.GetOrdinal("ModifiedDate"), now);
                        }

                        if (entry.State == EntityState.Added)
                        {
                            entryValues.SetString(entryValues.GetOrdinal("CreatedBy"), userId);
                            entryValues.SetDateTime(entryValues.GetOrdinal("CreatedDate"), now);
                        }
                    }
                }
            }

            return(base.SaveChanges());
        }
Exemple #17
0
        private PropagatorResult CreateSimpleResult(IEntityStateEntry stateEntry, IExtendedDataRecord record, MemberInformation memberInformation,
                                                    int identifier, bool isModified, int recordOrdinal, object value)
        {
            CurrentValueRecord updatableRecord = record as CurrentValueRecord;

            // construct flags for the value, which is needed for complex type and simple members
            PropagatorFlags flags = memberInformation.Flags;

            if (!isModified)
            {
                flags |= PropagatorFlags.Preserve;
            }
            if (PropagatorResult.NullIdentifier != identifier)
            {
                // construct a key member
                PropagatorResult result;
                if ((memberInformation.IsServerGenerated || memberInformation.IsForeignKeyMember) && null != updatableRecord)
                {
                    result = PropagatorResult.CreateServerGenKeyValue(flags, value, stateEntry, identifier, recordOrdinal);
                }
                else
                {
                    result = PropagatorResult.CreateKeyValue(flags, value, stateEntry, identifier);
                }

                // we register the entity as the "owner" of an identity so that back-propagation can succeed
                // (keys can only be back-propagated to entities, not association ends). It also allows us
                // to walk to the entity state entry in case of exceptions, since the state entry propagated
                // through the stack may be eliminated in a project above a join.
                m_translator.KeyManager.RegisterIdentifierOwner(result);

                return(result);
            }
            else
            {
                if ((memberInformation.IsServerGenerated || memberInformation.IsForeignKeyMember) && null != updatableRecord)
                {
                    // note: we only produce a server gen result when
                    return(PropagatorResult.CreateServerGenSimpleValue(flags, value, updatableRecord, recordOrdinal));
                }
                else
                {
                    return(PropagatorResult.CreateSimpleValue(flags, value));
                }
            }
        }
        public new void SaveChanges()
        {
            //For audit fields
            ObjectContext context = ((IObjectContextAdapter)this).ObjectContext;
            //Find all Entities that are Added/Modified that inherit from my EntityBase
            IEnumerable <ObjectStateEntry> objectStateEntries =
                from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                where
                e.IsRelationship == false &&
                e.Entity != null
                select e;

            var currentTime = DateTime.Now;

            foreach (var entry in objectStateEntries)
            {
                var entityBase = entry.Entity;
                CurrentValueRecord entryValues = entry.CurrentValues;

                //Only do if the entities have the audit columns (to be on the safer side)
                int ordinalValue = 0;
                try
                {
                    ordinalValue = entryValues.GetOrdinal("CreatedDate");
                }
                catch (Exception)
                {
                    ordinalValue = 0;
                }
                if (ordinalValue > 0)
                {
                    //Getting the user ID
                    string userID = "9999"; // string.Empty;
                                            //try
                                            //{
                                            //	userID = HelperService.ContextObject.UserID.ToString();
                                            //}
                                            //catch (Exception)
                                            //{

                    //	userID = "9999";
                    //}
                    //string userID = Convert.ToString(HelperService.ContextObject.UserID);
                    //string userID = HelperService.ContextObject.UserID.ToString();
                    //Irrespective of update or insert always the updated columns are updated
                    //To be doubly sure, put try catch
                    try
                    {
                        entryValues.SetDateTime(entryValues.GetOrdinal("UpdatedDate"), DateTime.Now);
                        entryValues.SetString(entryValues.GetOrdinal("UpdatedBy"), userID);
                        //If insert, update the other two audit columns as well
                        if (entry.State == EntityState.Added)
                        {
                            entryValues.SetDateTime(entryValues.GetOrdinal("CreatedDate"), DateTime.Now);
                            entryValues.SetString(entryValues.GetOrdinal("CreatedBy"), userID);
                        }
                        // as there is no deletion so we assume that entity state can only be modified -- siddharth (as discussed with brahma on 24th Jan 2014)
                        else
                        {
                            var dbValueOfEntity = this.Entry(entry.Entity).GetDatabaseValues();
                            //var createdDate = this.Entry(entry.Entity).GetDatabaseValues().GetValue<DateTime?>("CreatedDate");
                            var createdDate = dbValueOfEntity.GetValue <DateTime?>("CreatedDate");
                            var createdBy   = dbValueOfEntity.GetValue <string>("CreatedBy");
                            if (createdDate != null)
                            {
                                entryValues.SetDateTime(entryValues.GetOrdinal("CreatedDate"), createdDate.Value);
                            }
                            if (createdBy != null)
                            {
                                var createdByOrdinal = entryValues.GetOrdinal("CreatedBy");
                                //if (createdByOrdinal.GetType() == typeof(string))
                                //{
                                // entryValues.SetString(createdByOrdinal, createdBy);
                                //}
                                //else // the value createdby is of integer type
                                //{
                                // entryValues.SetInt32(createdByOrdinal, Convert.ToInt32(createdBy));
                                //}
                                entryValues.SetString(createdByOrdinal, createdBy);
                            }
                        }
                    }
                    catch (Exception)
                    {
                        //Do nothing
                    }
                }
            }
            //End audit fields
            base.SaveChanges();
        }
Exemple #19
0
        public override int SaveChanges()
        {
            ChangeTracker.DetectChanges(); // Important!

            ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext;

            List <ObjectStateEntry> objectStateEntryList =
                ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added
                                                             | EntityState.Modified
                                                             | EntityState.Deleted)
                .ToList();

            foreach (ObjectStateEntry entry in objectStateEntryList)
            {
                if (!entry.IsRelationship)
                {
                    switch (entry.State)
                    {
                    case EntityState.Added:
                        // write log...
                        break;

                    case EntityState.Deleted:
                        // write log...
                        break;

                    case EntityState.Modified:
                    {
                        if (ObjectContext.GetObjectType(entry.Entity.GetType()) == typeof(DeviceParameter))
                        {
                            DbDataRecord original = entry.OriginalValues;
                            string       oldValue = original.GetValue(
                                original.GetOrdinal("Value"))
                                                    .ToString();

                            CurrentValueRecord current  = entry.CurrentValues;
                            string             newValue = current.GetValue(
                                current.GetOrdinal("Value"))
                                                          .ToString();

                            if (oldValue != newValue)     // probably not necessary
                            {
                                ParameterChangeHistory hist = new ParameterChangeHistory();
                                hist.Date     = DateTime.Now;
                                hist.Property = (DeviceParameter)(object)entry.Entity;
                                hist.Value    = newValue;
                                this.ParameterChanges.Add(hist);
                            }

                            if (this.ParamUpdateEvent != null)
                            {
                                Task.Factory.StartNew(() => this.ParamUpdateEvent((DeviceParameter)entry.Entity));
                            }
                        }
                        else if (ObjectContext.GetObjectType(entry.Entity.GetType()) == typeof(DeviceActionResult))
                        {
                            DbDataRecord original = entry.OriginalValues;
                            string       oldValue = original.GetValue(
                                original.GetOrdinal("Value"))
                                                    .ToString();

                            CurrentValueRecord current  = entry.CurrentValues;
                            string             newValue = current.GetValue(
                                current.GetOrdinal("Value"))
                                                          .ToString();

                            if (oldValue != newValue)     // probably not necessary
                            {
                                ActionChangeHistory hist = new ActionChangeHistory();
                                hist.Date     = DateTime.Now;
                                hist.Property = (DeviceActionResult)(object)entry.Entity;
                                hist.Value    = newValue;
                                this.ActionChangeHistory.Add(hist);
                            }

                            if (this.ActionUpdateEvent != null)
                            {
                                Task.Factory.StartNew(() => this.ActionUpdateEvent((DeviceActionResult)entry.Entity));
                            }
                        }
                        else if (ObjectContext.GetObjectType(entry.Entity.GetType()) == typeof(Device))
                        {
                            Task.Factory.StartNew(() => this.DeviceUpdateEvent((Device)entry.Entity));
                        }
                        break;
                    }
                    }
                }
            }
            return(base.SaveChanges());
        }
 /// <summary>
 /// Is called when the object is being updated in the database
 /// </summary>
 /// <param name="ledgerEntry">The ledger object that will be saved</param>
 /// <returns>Return true if you want the ledger entry to be written to the database. Returning false would prevent this from happening. (base.LedgerOnUpdate() will return false)</returns>
 internal virtual bool LedgerOnUpdate(ContentLedger ledgerEntry, CurrentValueRecord currentValues, DbDataRecord originalValues, ConcentratorDataContext dataContext)
 {
     return(false);
 }
Exemple #21
0
        private static void context_SavingChanges(object sender, EventArgs e)
        {
            // Find any new or modified entities using our user/timestampting
            // fields and update them accordingly.
            foreach (ObjectStateEntry entry in
                     ((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries
                         (EntityState.Added | EntityState.Modified))
            {
                // Only work with entities that have our user/timestamp records in them.
                try
                {
                    if (!entry.IsRelationship)
                    {
                        CurrentValueRecord entryValues = entry.CurrentValues;
                        System.Collections.Specialized.NameValueCollection updateField = CheckEntityUpdateField(entry.CurrentValues);

                        HttpContext currContext = HttpContext.Current;
                        int         userId      = -1;
                        DateTime    now         = DateTime.Now;

                        if (currContext != null)
                        {
                            if (currContext.User.Identity.IsAuthenticated)
                            {
                                if (currContext.Session != null && currContext.Session["userId"] != null)
                                {
                                    userId = (int)currContext.Session["userId"];
                                }
                                else
                                {
                                    //userId = Security.GetUserId(currContext.User.Identity.Name);
                                }
                            }
                        }

                        if (entry.State == EntityState.Modified)
                        {
                            if (updateField["updater_id"] == "true")
                            {
                                entryValues.SetInt32(entryValues.GetOrdinal("updater_id"), userId);
                            }

                            if (updateField["updated_at"] == "true")
                            {
                                entryValues.SetDateTime(entryValues.GetOrdinal("updated_at"), now);
                            }
                        }

                        if (entry.State == EntityState.Added)
                        {
                            // If creator/updater values have not already been set,
                            // default them to the current user/time. We will already have
                            // creator/updater for version records.

                            for (int x = 0; x < updateField.Count; x++)
                            {
                                string key = updateField.Keys[x];
                                if (key.Contains("_id") && updateField[x] == "true")
                                {
                                    // Sometimes when a new object is created, the creator_id is defaulted
                                    // to 0. This is invalid for our processing.
                                    if (entryValues.IsDBNull(entryValues.GetOrdinal(key)) ||
                                        entryValues.GetInt32(entryValues.GetOrdinal(key)) == 0
                                        )
                                    {
                                        entryValues.SetInt32(entryValues.GetOrdinal(key), userId);
                                    }
                                }
                                else if (updateField.Keys[x].Contains("_at") && updateField[x] == "true")
                                {
                                    // Sometimes when a new object is created, the year is defaulted to
                                    // 1/1/0001. This is an invalid year or our processing
                                    if (entryValues.IsDBNull(entryValues.GetOrdinal(key)) ||
                                        entryValues.GetDateTime(entryValues.GetOrdinal(key)).Year == 1
                                        )
                                    {
                                        entryValues.SetDateTime(entryValues.GetOrdinal(key), now);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    //Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                }
            }
        }
Exemple #22
0
        private static System.Collections.Specialized.NameValueCollection CheckEntityUpdateField(CurrentValueRecord entry)
        {
            System.Collections.Specialized.NameValueCollection returnResult = new System.Collections.Specialized.NameValueCollection(4);
            returnResult.Add("creator_id", "false");
            returnResult.Add("created_at", "false");
            returnResult.Add("updater_id", "false");
            returnResult.Add("updated_at", "false");

            foreach (var field in entry.DataRecordInfo.FieldMetadata)
            {
                switch (field.FieldType.Name)
                {
                case "creator_id":
                case "created_at":
                case "updater_id":
                case "updated_at":
                    returnResult[field.FieldType.Name] = "true";
                    break;
                }
            }

            return(returnResult);
        }
Exemple #23
0
        public override int SaveChanges()
        {
            //int result = -1;
            DateTime eventDateTime = DateTime.Now;
            //string eventUser = HttpContext.Current.User.Identity.Name;
            User   u         = GetUserByLoginName(HttpContext.Current.User.Identity.Name.Split('\\').Last(), false);
            string eventUser = u.DisplayName;

            ChangeTracker.DetectChanges(); // Important!

            ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext;

            List <ObjectStateEntry> objectStateEntryList =
                ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added
                                                             | EntityState.Modified
                                                             | EntityState.Deleted)
                .ToList();


            foreach (ObjectStateEntry entry in objectStateEntryList)
            {
                AuditEvent auditRecord = new AuditEvent();
                auditRecord.EventDate = DateTime.Now;
                auditRecord.UserID    = eventUser;
                if (entry.Entity == null)
                {
                    continue;
                }
                string   objModel = entry.Entity.ToString();
                string[] objArray = objModel.Split('.');
                string   objType  = objArray.Last();;
                if (objType.Contains("_"))
                {
                    objType = objType.Substring(0, objType.IndexOf('_'));
                    var testAuditType = this.AuditDescriptions.Where(a => a.AuditDescription.StartsWith(objType));
                    if (testAuditType.Count() == 0)
                    {
                        objType = entry.EntitySet.ToString();
                    }
                    else
                    {
                        string newObjType = testAuditType.First().AuditDescription.ToString();
                        int    spaceLoc   = newObjType.IndexOf(' ');
                        if (spaceLoc > 0)
                        {
                            objType = newObjType.Substring(0, spaceLoc);
                        }
                    }
                }
                if (!entry.IsRelationship && !objType.StartsWith("Audit") && objType != "EdmMetadata")
                {
                    switch (entry.State)
                    {
                    case EntityState.Added:
                    {
                        //result = base.SaveChanges();
                        string objName   = string.Format("{0} Added", objType);
                        int    AuditType = this.AuditDescriptions.Where(a => a.AuditDescription.ToLower() == objName.ToLower()).Take(1).Single().idAuditEventDescription;
                        auditRecord.EventDescription        = objName;
                        auditRecord.idAuditEventDescription = AuditType;
                        auditRecord.RecordChanged           = entry.CurrentValues.GetValue(0).ToString();
                        try
                        {
                            int    ord   = entry.CurrentValues.GetOrdinal("tipstaffRecordID");
                            string value = entry.CurrentValues.GetValue(ord).ToString();
                            auditRecord.RecordAddedTo = Int32.Parse(value);
                        }
                        catch
                        {
                            try
                            {
                                int    ord   = entry.CurrentValues.GetOrdinal("warrantID");
                                string value = entry.CurrentValues.GetValue(ord).ToString();
                                auditRecord.RecordAddedTo = Int32.Parse(value);
                            }
                            catch
                            {
                                try
                                {
                                    int    ord   = entry.CurrentValues.GetOrdinal("childAbductionID");
                                    string value = entry.CurrentValues.GetValue(ord).ToString();
                                    auditRecord.RecordAddedTo = Int32.Parse(value);
                                }
                                catch
                                {
                                    auditRecord.RecordAddedTo = null;
                                }
                            }
                        }
                        break;
                    }

                    case EntityState.Deleted:
                    {
                        string objName   = string.Format("{0} Deleted", objType);
                        int    AuditType = this.AuditDescriptions.Where(a => a.AuditDescription.ToLower() == objName.ToLower()).Take(1).Single().idAuditEventDescription;
                        auditRecord.EventDescription        = objName;
                        auditRecord.idAuditEventDescription = AuditType;
                        auditRecord.RecordChanged           = entry.OriginalValues.GetValue(0).ToString();
                        try
                        {
                            int    ord   = entry.OriginalValues.GetOrdinal("tipstaffRecordID");
                            string value = entry.OriginalValues.GetValue(ord).ToString();
                            auditRecord.RecordAddedTo = Int32.Parse(value);
                        }
                        catch
                        {
                            try
                            {
                                int    ord   = entry.OriginalValues.GetOrdinal("warrantID");
                                string value = entry.OriginalValues.GetValue(ord).ToString();
                                auditRecord.RecordAddedTo = Int32.Parse(value);
                            }
                            catch
                            {
                                try
                                {
                                    int    ord   = entry.OriginalValues.GetOrdinal("childAbductionID");
                                    string value = entry.OriginalValues.GetValue(ord).ToString();
                                    auditRecord.RecordAddedTo = Int32.Parse(value);
                                }
                                catch
                                {
                                    auditRecord.RecordAddedTo = null;
                                }
                            }
                        }
                        // Iterate over the members (i.e. properties (including complex properties), references, collections) of the entity type
                        List <AuditEventDataRow> data = new List <AuditEventDataRow>();
                        foreach (EdmMember member in entry.EntitySet.ElementType.Members)
                        {
                            string           propertyName = member.Name.ToString();
                            DbPropertyValues oldData      = this.Entry(entry.Entity).GetDatabaseValues();
                            string           oldValue     = "";
                            string           newValue     = "deleted";
                            try
                            {
                                oldValue = (oldData.GetValue <object>(propertyName) != null) ? oldData.GetValue <object>(propertyName).ToString() : "Empty";
                                if (oldValue == "")
                                {
                                    oldValue = "Empty";
                                }
                            }
                            catch
                            { oldValue = "Could not be mapped"; }

                            if ((oldValue != newValue) && (oldValue != "Could not be mapped"))         // probably not necessary
                            {
                                AuditEventDataRow newAuditRow = new AuditEventDataRow();
                                newAuditRow.ColumnName = propertyName;
                                newAuditRow.Was        = oldValue.Length <= 199 ? oldValue : oldValue.Substring(0, 199);
                                newAuditRow.Now        = newValue.Length <= 199 ? newValue : newValue.Substring(0, 199);
                                data.Add(newAuditRow);
                            }
                        }
                        if (data.Count() > 0)
                        {
                            auditRecord.AuditEventDataRows = data;
                        }
                        break;
                    }

                    case EntityState.Modified:
                    {
                        string objName   = string.Format("{0} Amended", objType);
                        int    AuditType = this.AuditDescriptions.Where(a => a.AuditDescription.ToLower() == objName.ToLower()).Take(1).Single().idAuditEventDescription;
                        auditRecord.EventDescription        = objName;
                        auditRecord.idAuditEventDescription = AuditType;
                        auditRecord.RecordChanged           = entry.CurrentValues.GetValue(0).ToString();
                        List <AuditEventDataRow> data = new List <AuditEventDataRow>();
                        foreach (string propertyName in entry.GetModifiedProperties())
                        {
                            DbPropertyValues oldData  = this.Entry(entry.Entity).GetDatabaseValues();
                            string           oldValue = (oldData.GetValue <object>(propertyName) != null) ? oldData.GetValue <object>(propertyName).ToString() : "Empty";
                            if (oldValue == "")
                            {
                                oldValue = "Empty";
                            }

                            CurrentValueRecord current  = entry.CurrentValues;
                            string             newValue = (current.GetValue(current.GetOrdinal(propertyName)) != null) ? current.GetValue(current.GetOrdinal(propertyName)).ToString() : "Empty";
                            if (newValue == "")
                            {
                                newValue = "Empty";
                            }

                            if (objType == "Template" && propertyName == "templateXML")
                            {
                                oldValue = "XML";
                                newValue = "XML - Too long to record new version";
                            }

                            if (oldValue != newValue)         // probably not necessary
                            {
                                AuditEventDataRow newAuditRow = new AuditEventDataRow();
                                newAuditRow.ColumnName = propertyName;
                                newAuditRow.Was        = oldValue.Length <= 199 ? oldValue : oldValue.Substring(0, 199);
                                newAuditRow.Now        = newValue.Length <= 199 ? newValue : newValue.Substring(0, 199);
                                data.Add(newAuditRow);
                            }
                        }
                        if (data.Count() > 0)
                        {
                            auditRecord.AuditEventDataRows = data;
                        }
                        break;
                    }
                    }
                }

                if (auditRecord.RecordChanged == "0" && auditRecord.RecordAddedTo == 0 && auditRecord.EventDescription.Contains("Added"))
                {
                    //New TipstaffRecord derivative record added, so...
                    //save the record
                    base.SaveChanges();
                    //extract the new identity
                    auditRecord.RecordChanged = entry.CurrentValues.GetValue(0).ToString();
                    //update the audit event
                    this.AuditEvents.Add(auditRecord);
                    //and savechanges at the end of the code block
                }
                else if (auditRecord.RecordChanged == "0" && auditRecord.RecordAddedTo != 0 && auditRecord.EventDescription.Contains("Added"))
                {
                    //New record added, so...
                    //save the record
                    base.SaveChanges();
                    //extract the new identity
                    auditRecord.RecordChanged = entry.CurrentValues.GetValue(0).ToString();
                    //update the audit event
                    this.AuditEvents.Add(auditRecord);
                    //and savechanges at the end of the code block
                }
                else if (auditRecord.RecordChanged != "0" && auditRecord.RecordChanged != null && (auditRecord.AuditEventDataRows != null && auditRecord.AuditEventDataRows.Count > 0))
                {
                    this.AuditEvents.Add(auditRecord);
                    //base.SaveChanges();
                }
                try
                {
                    //base.SaveChanges();
                    //only uncomment for error handling
                }
                catch (DbEntityValidationException ex)
                {
                    System.Diagnostics.Debug.Print(ex.Message);
                }
                catch (DbUpdateException ex)
                {
                    System.Diagnostics.Debug.Print(ex.Message);
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.Print(ex.Message);
                }
            }
            return(base.SaveChanges());
        }
Exemple #24
0
        private void context_SavingChanges(Object sender, EventArgs e)
        {
            string NewProductID, OldProductID;
            int    NewQuantity, OldQuantity;

            //取得所有新增的出貨單明細
            foreach (var AddedEntry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Added))
            {
                if (!AddedEntry.IsRelationship)
                {
                    if (AddedEntry.Entity is DeliveryDetails)
                    {
                        NewProductID = ((DeliveryDetails)(AddedEntry.Entity)).ProductID;
                        //判斷出貨別
                        if (deliveryTypeTextBox.Text == "1")
                        {
                            //出貨別=出貨,要更新庫存量與更新商品的最近出貨日
                            //更新庫存量
                            XIN.DecStock(context, NewProductID,
                                         ((DeliveryDetails)(AddedEntry.Entity)).Quantity);
                            //更新商品的最近出貨日
                            var qry = (from P in context.Product
                                       where P.ProductID == NewProductID
                                       select P).FirstOrDefault();
                            qry.LastDeliveryDate = Convert.ToDateTime(
                                deliveryDateTextBox.Text);
                        }
                        else
                        {
                            //出貨別=出貨退回,只要更新庫存量
                            XIN.IncStock(context, NewProductID,
                                         ((DeliveryDetails)(AddedEntry.Entity)).Quantity);
                        }
                    }
                }
            }
            //取得所有修改的出貨單明細
            foreach (var ModifiedEntry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Modified))
            {
                if (!ModifiedEntry.IsRelationship)
                {
                    if (ModifiedEntry.Entity is DeliveryDetails)
                    {
                        //取得目前的商品編號與數量
                        CurrentValueRecord curr = ModifiedEntry.CurrentValues;
                        NewProductID = (string)(curr.GetValue(
                                                    curr.GetOrdinal("ProductID")));
                        NewQuantity = (int)
                                      (curr.GetValue(curr.GetOrdinal("Quantity")));
                        //取得原來的商品編號與數量
                        OriginalValueRecord org =
                            ModifiedEntry.GetUpdatableOriginalValues();
                        OldProductID = (string)
                                       (org.GetValue(curr.GetOrdinal("ProductID")));
                        OldQuantity = (int)(org.GetValue(curr.GetOrdinal("Quantity")));
                        //判斷出貨別
                        if (deliveryTypeTextBox.Text == "1")
                        {
                            //出貨別=出貨,要更新庫存量與更新商品的最近出貨日
                            //增加原來的商品編號的庫存量
                            XIN.IncStock(context, OldProductID, OldQuantity);
                            //減少目前的商品編號的庫存量
                            XIN.DecStock(context, NewProductID, NewQuantity);
                            //更新商品的最近出貨日
                            var qry = (from P in context.Product
                                       where P.ProductID == NewProductID
                                       select P).FirstOrDefault();
                            qry.LastDeliveryDate = Convert.ToDateTime(
                                deliveryDateTextBox.Text);
                        }
                        else
                        {
                            //出貨別=出貨退回,只要更新庫存量
                            //增加目前的商品編號的庫存量
                            XIN.IncStock(context, NewProductID, NewQuantity);
                            //減少原來的商品編號的庫存量
                            XIN.DecStock(context, OldProductID, OldQuantity);
                        }
                    }
                }
            }
            //取得所有刪除的出貨單明細
            foreach (var DeletedEntry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Deleted))
            {
                if (!DeletedEntry.IsRelationship)
                {
                    if (DeletedEntry.Entity is DeliveryDetails)
                    {
                        OldProductID = ((DeliveryDetails)
                                        (DeletedEntry.Entity)).ProductID;
                        //判斷出貨別
                        if (DeleteDeliveryType == "1")
                        {
                            //出貨別=出貨,要更新庫存量
                            //更新庫存量
                            XIN.IncStock(context, OldProductID,
                                         ((DeliveryDetails)(DeletedEntry.Entity)).Quantity);
                        }
                        else
                        {
                            //出貨別=出貨退回,只要更新庫存量
                            XIN.DecStock(context, OldProductID,
                                         ((DeliveryDetails)(DeletedEntry.Entity)).Quantity);
                        }
                    }
                }
            }
        }
Exemple #25
0
        private void context_SavingChanges(Object sender, EventArgs e)
        {
            string NewProductID, OldProductID;
            int    NewQuantity, OldQuantity;

            //取得所有新增的存貨異動單明細
            foreach (var AddedEntry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Added))
            {
                if (!AddedEntry.IsRelationship)
                {
                    if (AddedEntry.Entity is TransferDetails)
                    {
                        NewProductID = ((TransferDetails)(AddedEntry.Entity)).ProductID;
                        //判斷異動別
                        if (transferTypeTextBox.Text == "1")
                        {
                            //異動別=入庫,要更新庫存量
                            XIN.IncStock(context, NewProductID,
                                         ((TransferDetails)(AddedEntry.Entity)).Quantity);
                        }
                        else
                        {
                            //異動別=出庫,要更新庫存量
                            XIN.DecStock(context, NewProductID,
                                         ((TransferDetails)(AddedEntry.Entity)).Quantity);
                        }
                    }
                }
            }
            //取得所有修改的存貨異動單明細
            foreach (var ModifiedEntry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Modified))
            {
                if (!ModifiedEntry.IsRelationship)
                {
                    if (ModifiedEntry.Entity is TransferDetails)
                    {
                        //取得目前的商品編號與數量
                        CurrentValueRecord curr = ModifiedEntry.CurrentValues;
                        NewProductID = (string)(curr.GetValue(
                                                    curr.GetOrdinal("ProductID")));
                        NewQuantity = (int)
                                      (curr.GetValue(curr.GetOrdinal("Quantity")));
                        //取得原來的商品編號與數量
                        OriginalValueRecord org =
                            ModifiedEntry.GetUpdatableOriginalValues();
                        OldProductID = (string)
                                       (org.GetValue(curr.GetOrdinal("ProductID")));
                        OldQuantity = (int)(org.GetValue(curr.GetOrdinal("Quantity")));
                        //判斷異動別
                        if (transferTypeTextBox.Text == "1")
                        {
                            //異動別=入庫
                            //增加目前的商品編號的庫存量
                            XIN.IncStock(context, NewProductID, NewQuantity);
                            //減少原來的商品編號的庫存量
                            XIN.DecStock(context, OldProductID, OldQuantity);
                        }
                        else
                        {
                            //異動別=出庫
                            //增加原來的商品編號的庫存量
                            XIN.IncStock(context, OldProductID, OldQuantity);
                            //減少目前的商品編號的庫存量
                            XIN.DecStock(context, NewProductID, NewQuantity);
                        }
                    }
                }
            }
            //取得所有刪除的存貨異動單明細
            foreach (var DeletedEntry in context.ObjectStateManager
                     .GetObjectStateEntries(EntityState.Deleted))
            {
                if (!DeletedEntry.IsRelationship)
                {
                    if (DeletedEntry.Entity is TransferDetails)
                    {
                        OldProductID = ((TransferDetails)
                                        (DeletedEntry.Entity)).ProductID;
                        //判斷異動別
                        if (DeleteTransferType == "1")
                        {
                            //異動別=入庫,更新庫存量
                            XIN.DecStock(context, OldProductID,
                                         ((TransferDetails)(DeletedEntry.Entity)).Quantity);
                        }
                        else
                        {
                            //異動別=出庫,更新庫存量
                            XIN.IncStock(context, OldProductID,
                                         ((TransferDetails)(DeletedEntry.Entity)).Quantity);
                        }
                    }
                }
            }
        }