/// <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); }
/// <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); }
/// <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); }
/// <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); }