private static I_DBHelper GetDBHelper(DatabaseInformation database)
        {
            I_DBHelper dbHelper = System.Runtime.Remoting.Messaging.CallContext.GetData(database.Name) as I_DBHelper;

            if (dbHelper == null)
            {
                var dbProvider = GetDatabaseProvider(database);
                if (dbProvider == DatabaseProvider.SQLServer)
                {
                    var connection = new SqlConnection(database.ConnectionString);
                    dbHelper = new SQLHelper(connection);
                    System.Runtime.Remoting.Messaging.CallContext.SetData(database.Name, dbHelper);
                }
                else if (dbProvider == DatabaseProvider.Oracle)
                {
                }
            }

            return(dbHelper);
        }
        public static TransactionResult ExecuteTransactionalQueryItems(List <QueryItem> queryItems)
        {
            TransactionResult result = new MyConnectionManager.TransactionResult();

            foreach (var queryItem in queryItems)
            {
                TransactionQueryResult queryResult = new MyConnectionManager.TransactionQueryResult(queryItem);
                result.QueryItems.Add(queryResult);
            }
            List <Tuple <int, I_DBHelper> > dbHelpers = new List <Tuple <int, MyConnectionManager.I_DBHelper> >();

            //بهتره ایدی دیتابیس در انتیت قرار گیرد
            //List<Tuple<int, DatabaseInformation>> entityDatabaseIDs = new List<Tuple<int, DatabaseInformation>>();

            //using (var context = new MyProjectEntities())
            //{
            //    foreach (var queryResult in result.QueryItems)
            //    {
            //        var queryItem = queryResult.QueryItem;
            //        if (!entityDatabaseIDs.Any(x => x.Item1 == queryItem.TargetEntityID))
            //        {
            //            var entityID = 0;
            //            if (queryItem.DataItem != null)
            //                entityID = queryItem.DataItem.TargetEntityID;
            //            else
            //                entityID = queryItem.TargetEntityID;
            //            var database = context.TableDrivedEntity.First(x => x.ID == entityID).Table.DBSchema.DatabaseInformation;
            //            entityDatabaseIDs.Add(new Tuple<int, DatabaseInformation>(entityID, database));
            //        }
            //    }
            //}
            try
            {
                foreach (var queryResult in result.QueryItems)
                {
                    try
                    {
                        var queryItem = queryResult.QueryItem;
                        //var entityID = 0;
                        //if (queryItem.DataItem != null)
                        //    entityID = queryItem.TargetEntity.ID;
                        //else
                        //    entityID = queryItem.TargetEntityID;
                        //var database = entityDatabaseIDs.First(x => x.Item1 == entityID).Item2;
                        I_DBHelper dbHelper = null;
                        if (!dbHelpers.Any(x => x.Item1 == queryItem.TargetEntity.DatabaseID))
                        {
                            dbHelper = GetDBHelper(queryItem.TargetEntity.DatabaseID, true);
                            dbHelpers.Add(new Tuple <int, I_DBHelper>(queryItem.TargetEntity.DatabaseID, dbHelper));
                        }
                        else
                        {
                            dbHelper = dbHelpers.First(x => x.Item1 == queryItem.TargetEntity.DatabaseID).Item2;
                        }

                        dbHelper.ExecuteNonQuery(queryItem.Query);

                        if (queryItem.DataItem != null && queryItem.DataItem.GetProperties().Any(x => x.IsIdentity))
                        {
                            if (queryItem.DataItem.IsNewItem)
                            {
                                var identity = dbHelper.ExecuteScalar("select scope_identity()");
                                foreach (var identityProperty in queryItem.DataItem.GetProperties().Where(x => x.IsIdentity))
                                {
                                    //ایونت باید اینجا ریز بشه
                                    queryItem.DataItem.GetProperty(identityProperty.ColumnID).Value = identity.ToString();
                                }
                                //if (queryItem.SetIdentities.Any())
                                //{
                                //    foreach (var identityItem in queryItem.SetIdentities)
                                //    {
                                //        identityItem.TargetQueryItem.DataItem.GetProperty(identityItem.TargetColumnID).Value = identity.ToString();
                                //        identityItem.TargetQueryItem.Query = string.Format(identityItem.TargetQueryItem.Query, identity.ToString());
                                //    }
                                //}
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        queryResult.Exception = ex;
                        throw ex;
                    }
                }
                foreach (var dbHelper in dbHelpers)
                {
                    dbHelper.Item2.GetDBTransaction().Commit();
                }
                result.Successful = true;
            }
            catch (Exception ex)
            {
                foreach (var dbHelper in dbHelpers)
                {
                    dbHelper.Item2.GetDBTransaction().Rollback();
                }
                result.Message    = ex.Message;
                result.Successful = false;
            }
            finally
            {
                foreach (var dbHelper in dbHelpers)
                {
                    dbHelper.Item2.GetDBConnection().Close();
                }
            }
            return(result);
        }