示例#1
0
        /// <summary>
        /// Изменение записи в базе данных
        /// </summary>
        /// <typeparam name="Entity"></typeparam>
        /// <param name="record">Запись с обновленными значениями</param>
        /// <param name="condition">Услобие в базе данных которое выбирает запись</param>
        /// <returns></returns>
        public static bool Modify <Entity>(Entity record, Expression <Func <Entity, bool> > condition) where Entity : class
        {
            var result = false;
            var exists = false;

            using (var db = new InventoryContext(_connectionString))
            {
                using (var dbTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        var EntityTable = db.Set <Entity>();
                        var query       = EntityTable.Where(condition);
                        foreach (var rec in query)
                        {
                            exists = true;
                            var propertyes = EntityClone.GetProperties(typeof(Entity));
                            foreach (var property in propertyes)
                            {
                                property.SetValue(rec, property.GetValue(record));
                            }
                        }

                        if (exists)
                        {
                            db.SaveChanges();
                            dbTransaction.Commit();
                            result = true;
                        }
                    }
                    catch (Exception e)
                    {
                        dbTransaction.Rollback();

                        Console.WriteLine("Невозможно изменить запись в базе данных");
                    }
                }
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// Restores from entity clone.
        /// </summary>
        /// <param name="entity">The entity.</param>
        /// <param name="clone">The clone.</param>
        /// <param name="throwsExceptionOnAnyFailure">if set to <c>true</c> [throws exception on any failure].</param>
        /// <param name="messageLog">The message log.</param>
        /// <param name="session">The session.</param>
        /// <returns></returns>
        public static bool RestoreFromEntityClone(EntityBase entity, EntityClone clone, bool throwsExceptionOnAnyFailure, StringBuilder messageLog, ISession session)
        {
            if (entity == null)
            {
                ThrowHelper.ThrowArgumentNullException("entity");
            }
            if (clone == null)
            {
                ThrowHelper.ThrowArgumentNullException("clone");
            }
            if (session == null)
            {
                ThrowHelper.ThrowArgumentNullException("session");
            }

            if (messageLog == null)
            {
                messageLog = new StringBuilder();
            }

            bool result = true;

            foreach (KeyValuePair <string, object> entry in clone.Fields)
            {
                FieldInfo field = null;
                try
                {
                    field = TypeHelper.GetFieldByName(entity, entry.Key);

                    if (entry.Value == null)
                    {
                        field.SetValue(entity, null);
                    }
                    else if ((field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition().Equals(typeof(System.Collections.Generic.ISet <>))) ||
                             (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition().Equals(typeof(System.Collections.Generic.IList <>))) ||
                             (field.FieldType.Equals(typeof(System.Collections.IList))))
                    {
                        object enumerable = null;

                        if (field.FieldType.GetGenericTypeDefinition().Equals(typeof(System.Collections.Generic.ISet <>)))
                        {
                            // generic HashSet (.NET 4)
                            Type genericType = field.FieldType.GetGenericArguments()[0];
                            Type hashSetType = typeof(System.Collections.Generic.HashSet <>).MakeGenericType(genericType);
                            enumerable = hashSetType.GetConstructor(new Type[] { }).Invoke(null);
                        }
                        else if (field.FieldType.GetGenericTypeDefinition().Equals(typeof(System.Collections.Generic.IList <>)))
                        {
                            // generic List (.NET)
                            Type genericType = field.FieldType.GetGenericArguments()[0];
                            Type hashSetType = typeof(System.Collections.Generic.List <>).MakeGenericType(genericType);
                            enumerable = hashSetType.GetConstructor(new Type[] { }).Invoke(null);
                        }
                        else if (field.FieldType.Equals(typeof(System.Collections.IList)))
                        {
                            // non-generic list (.NET)
                            enumerable = new System.Collections.ArrayList();
                        }

                        MethodInfo  mi       = enumerable.GetType().GetMethod("Add");
                        IEnumerable proxySet = (IEnumerable)entry.Value;
                        foreach (EntityProxy item in proxySet)
                        {
                            EntityBase setItem = null;
                            try
                            {
                                setItem = (EntityBase)session.Get(item.EntityType, item.EntityId);
                            }
                            catch (Exception)
                            {
                            }
                            if (setItem == null)
                            {
                                String message = String.Format("Unable to find entity (Type: '{0}', Id: '{1}') which is an element of a Set. Parent entity type: '{2}', Field name of the set: '{3}'", item.EntityType.FullName, item.EntityId, entity.GetType().FullName, field.Name);
                                if (throwsExceptionOnAnyFailure)
                                {
                                    throw new EntityRestoreException(message);
                                }
                                else
                                {
                                    messageLog.Append(message);
                                    messageLog.Append(Environment.NewLine);
                                    result = false;
                                }
                            }
                            else
                            {
                                mi.Invoke(enumerable, new object[] { setItem });
                            }
                        }
                        field.SetValue(entity, enumerable);
                    }
                    else if (entry.Value is EntityProxy)
                    {
                        EntityProxy item             = (EntityProxy)entry.Value;
                        EntityBase  associatedEntity = null;
                        try
                        {
                            associatedEntity = (EntityBase)session.Get(item.EntityType, item.EntityId);
                        }
                        catch (Exception)
                        {
                        }
                        if (associatedEntity == null)
                        {
                            String message = String.Format("Unable to find an entity (Type: '{0}', Id: '{1}') which associated to its parent entity (Type: '{2}', Id: '{3}').", item.EntityType.FullName, item.EntityId, entity.GetType().FullName, entity.Id);
                            if (throwsExceptionOnAnyFailure)
                            {
                                throw new EntityRestoreException(message);
                            }
                            else
                            {
                                messageLog.Append(message);
                                messageLog.Append(Environment.NewLine);
                                result = false;
                            }
                        }
                        field.SetValue(entity, associatedEntity);
                    }
                    else if (entry.Value is ICloneable)
                    {
                        field.SetValue(entity, ((ICloneable)entry.Value).Clone());
                    }
                    else
                    {
                        field.SetValue(entity, entry.Value);
                    }
                }
                catch (MissingFieldException ex)
                {
                    // ez akkor történik, ha az eltérő entity verziók miatt nem található meg egyik másik field
                    // a rendszer tolerálja a hiányzó fieldeket, ha régi entitásból akarunk újabba menteni, de a megváltoztatott field típust nem
                    Version typeVersion = entity.GetType().Assembly.GetName().Version;
                    if (clone.EntityTypeVersion >= entity.GetType().Assembly.GetName().Version)
                    {
                        // azonos vagy újabb verzió
                        throw new EntityRestoreException(String.Format("Failed to restore entity. Entity restoration data belongs to version '{0}' which is newer than the current type version '{1}'. {2}", clone.EntityTypeVersion == null ? "<unknown>" : clone.EntityTypeVersion.ToString(), typeVersion.ToString(), clone.ToString()), ex);
                    }
                    else
                    {
                        if (LOGGER.IsErrorEnabled)
                        {
                            LOGGER.Error(String.Format("Entity cannot be restored fully, field '{0}' not found. Entity restoration data belongs to version '{1}' which is newer than the current type version '{2}'.", entry.Key, clone.EntityTypeVersion == null ? "<unknown>" : clone.EntityTypeVersion.ToString(), typeVersion.ToString(), clone.ToString()));
                        }
                    }
                }
                catch (EntityRestoreException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    throw new EntityRestoreException(String.Format("Failed to restore entity. {0}", clone.ToString()), ex);
                }
            }

            return(result);
        }
示例#3
0
 /// <summary>
 /// Restores from entity clone.
 /// </summary>
 /// <param name="entity">The entity.</param>
 /// <param name="clone">The clone.</param>
 /// <param name="session">The session.</param>
 public static void RestoreFromEntityClone(EntityBase entity, EntityClone clone, ISession session)
 {
     RestoreFromEntityClone(entity, clone, true, null, session);
 }
示例#4
0
        /// <summary>
        /// Добавляем или меняем транзакции в базе
        /// </summary>
        /// <param name="top">Если свойство Id = 0, функция добавляет новую транзакцию. Если в базе уже есть транзакция с тем же Id, вункция изменяет ее.</param>
        /// <param name="body"></param>
        /// <returns>Если прошло успешно возвращает true</returns>
        public static bool AddOrModifyTransaction(TransactionTopEntity top, List <TransactionListBodyEntity> body)
        {
            if (top == null || body == null)
            {
                return(false);
            }
            bool result = false;
            bool newTop = (top.Id == 0);

            using (var db = new InventoryContext(DatabaseConnection.ConnectionString))
            {
                using (var dbTransaction = db.Database.BeginTransaction())
                {
                    try
                    {
                        int transactionId = top.Id;

                        //Top записи
                        if (!newTop)    //Изменение
                        {
                            var topQuery = db.TransactionTop.Where(p => p.Id == top.Id);
                            foreach (var record in topQuery)
                            {
                                PropertyInfo[] properties = EntityClone.GetProperties(typeof(TransactionTopEntity));
                                foreach (PropertyInfo property in properties)
                                {
                                    property.SetValue(record, property.GetValue(top));
                                }
                            }

                            db.SaveChanges();
                            result = true;
                        }
                        else    //вставить
                        {
                            db.TransactionTop.Add(top);
                            db.SaveChanges();
                            result        = true;
                            transactionId = top.Id;
                        }

                        if (result)
                        {
                            result = false;
                            foreach (var rec in body)
                            {
                                rec.Body.TransactionId = transactionId;
                            }

                            var query = db.TransactionBody.Where(p => p.TransactionId == transactionId);
                            foreach (var rec in query)
                            {
                                var newRec = body.Where(p => p.Body.Id == rec.Id).FirstOrDefault();
                                if (newRec == null)
                                {
                                    db.TransactionBody.Remove(rec);
                                }
                                else
                                {
                                    PropertyInfo[] properties =
                                        EntityClone.GetProperties(typeof(TransactionBodyEntity));
                                    foreach (PropertyInfo property in properties)
                                    {
                                        property.SetValue(rec, property.GetValue(newRec.Body));
                                    }

                                    body.Remove(newRec);
                                }
                            }

                            // извлекаем новые записи
                            foreach (var rec in body)
                            {
                                db.TransactionBody.Add(rec.Body);
                            }

                            db.SaveChanges();
                            dbTransaction.Commit();
                            result = true;
                        }
                    }
                    catch (Exception e)
                    {
                        dbTransaction.Rollback();
                        Console.WriteLine("Нет изменений в транзакциях");
                    }
                }
            }

            return(result);
        }