/// <summary>
        /// Generates all the 'find' methods of this interface.
        /// </summary>
        /// <param name="classMap">The class map.</param>
        /// <param name="file">The file.</param>
        private static void GenerateFindMethods(IClassMap classMap, StreamWriter file)
        {
            // method name
            file.Write("		"+ EntityGenerator.GetTypeName(classMap) + " Find(");
            ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

            // method's params
            bool first = true;

            foreach (IColumnMap columnMap in primaryColumns)
            {
                IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(columnMap);

                if (!first)
                {
                    file.Write(", ");
                }

                // param type and name
                string paramName = ClassUtility.GetParamName(propertyMap);
                string paramType = ClassUtility.ConvertColumnTypeToCsType(columnMap.DataType);
                file.Write(paramType + " " + paramName);
                first = false;
            }
            file.Write(");");

            file.WriteLine();
        }
        /// <summary>
        /// Generates the 'delete' method.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="classMap">The class map.</param>
        public override void GenerateDelete(StreamWriter file, IClassMap classMap)
        {
            ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

            bool          first      = true;
            StringBuilder whereQuery = new StringBuilder(16 * primaryColumns.Count);

            foreach (IColumnMap columnMap in primaryColumns)
            {
                IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(columnMap);

                if (!first)
                {
                    whereQuery.Append("AND ");
                }

                whereQuery
                .Append('`')
                .Append(columnMap.Name)
                .Append("`='\" + m_state.EscapeString(")
                .Append("obj." + propertyMap.Name)
                .Append(".ToString()) + \"'");

                first = false;
            }

            string sqlCommand = "DELETE FROM `" + classMap.GetTableMap().Name + "`"
                                + " WHERE " + whereQuery.ToString();

            file.WriteLine("			m_state.ExecuteNonQuery(");
            file.WriteLine("				\""+ sqlCommand + "\");");
        }
		/// <summary>
		/// Generates all the 'find' methods of this interface.
		/// </summary>
		/// <param name="classMap">The class map.</param>
		/// <param name="file">The file.</param>
		private static void GenerateFindMethods (IClassMap classMap, StreamWriter file)
		{				
			// method name
			file.Write("		" + EntityGenerator.GetTypeName(classMap) + " Find(");
			ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

			// method's params
			bool first = true;
			foreach (IColumnMap columnMap in primaryColumns)
			{
				IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(columnMap);

				if (!first)
				{
					file.Write(", ");
				}

				// param type and name
				string paramName = ClassUtility.GetParamName(propertyMap);
				string paramType = ClassUtility.ConvertColumnTypeToCsType(columnMap.DataType);
				file.Write(paramType + " " + paramName);
				first = false;

			}
			file.Write(");");

			file.WriteLine();
		}
		/// <summary>
		/// Generates the 'find' method.
		/// </summary>
		/// <param name="file">The file.</param>
		/// <param name="classMap">The class map.</param>
		public override void GenerateFind(StreamWriter file, IClassMap classMap)
		{
			ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

			StringBuilder whereQuery = new StringBuilder();
			StringBuilder findParams = new StringBuilder();
			bool first = true;

			foreach (IColumnMap primColumn in primaryColumns)
			{
				IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(primColumn);

				if (!first)
				{
					whereQuery.Append(", ");
					findParams.Append(", ");
				}

				whereQuery
					.Append('`')
					.Append(primColumn.Name)
					.Append("`='\" + m_state.EscapeString(")
					.Append(ClassUtility.GetParamName(propertyMap))
					.Append(".ToString()) + \"'");

				string paramName = ClassUtility.GetParamName(propertyMap);
				string paramType = ClassUtility.ConvertColumnTypeToCsType(primColumn.DataType);
					
				findParams.Append(paramType + " " + paramName);

				first = false;
			}
			
			string entityClassName = EntityGenerator.GetTypeName(classMap);
			string sqlCommand = "SELECT \" + c_rowFields + \""
				+ " FROM `" + classMap.GetTableMap().Name + "`"
				+ " WHERE " + whereQuery.ToString();

			file.WriteLine("		public virtual " + entityClassName + " Find(" + findParams.ToString() + ")");
			file.WriteLine("		{");
			file.WriteLine("			" + entityClassName + " result = new " + entityClassName + "();");
			file.WriteLine("			string command = \"" + sqlCommand + "\";");
			file.WriteLine();
			file.WriteLine("			m_state.ExecuteQuery(");
			file.WriteLine("				command,");
			file.WriteLine("				CommandBehavior.SingleRow,");
			file.WriteLine("				delegate(MySqlDataReader reader)");
			file.WriteLine("				{");
			file.WriteLine("					if (!reader.Read())");
			file.WriteLine("					{");
			file.WriteLine("						result = null;");
			file.WriteLine("					}");
			file.WriteLine("					else");
			file.WriteLine("					{");
			file.WriteLine("						FillEntityWithRow(ref result, reader);");
			file.WriteLine("					}");
			file.WriteLine("				}");
			file.WriteLine("			);");
			file.WriteLine();
			file.WriteLine("			return result;");
			file.WriteLine("		}");
			file.WriteLine();
		}
		/// <summary>
		/// Generates the 'delete' method.
		/// </summary>
		/// <param name="file">The file.</param>
		/// <param name="classMap">The class map.</param>
		public override void GenerateDelete(StreamWriter file, IClassMap classMap)
		{
			ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

			bool first = true;
			StringBuilder whereQuery = new StringBuilder(16 * primaryColumns.Count);

			foreach (IColumnMap columnMap in primaryColumns)
			{
				IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(columnMap);
				
				if (!first)
				{
					whereQuery.Append("AND ");
				}

				whereQuery
					.Append('`')
					.Append(columnMap.Name)
					.Append("`='\" + m_state.EscapeString(")
					.Append("obj." + propertyMap.Name)
					.Append(".ToString()) + \"'");

				first = false;
			}

			string sqlCommand = "DELETE FROM `" + classMap.GetTableMap().Name + "`"
				+ " WHERE " + whereQuery.ToString();

			file.WriteLine("			m_state.ExecuteNonQuery(");
			file.WriteLine("				\"" + sqlCommand + "\");");
		}
        /// <summary>
        /// Generates the 'find' method.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="classMap">The class map.</param>
        public override void GenerateFind(StreamWriter file, IClassMap classMap)
        {
            ArrayList primaryColumns = classMap.GetTableMap().GetPrimaryKeyColumnMaps();

            StringBuilder whereQuery = new StringBuilder();
            StringBuilder findParams = new StringBuilder();
            bool          first      = true;

            foreach (IColumnMap primColumn in primaryColumns)
            {
                IPropertyMap propertyMap = classMap.GetPropertyMapForColumnMap(primColumn);

                if (!first)
                {
                    whereQuery.Append(", ");
                    findParams.Append(", ");
                }

                whereQuery
                .Append('`')
                .Append(primColumn.Name)
                .Append("`='\" + m_state.EscapeString(")
                .Append(ClassUtility.GetParamName(propertyMap))
                .Append(".ToString()) + \"'");

                string paramName = ClassUtility.GetParamName(propertyMap);
                string paramType = ClassUtility.ConvertColumnTypeToCsType(primColumn.DataType);

                findParams.Append(paramType + " " + paramName);

                first = false;
            }

            string entityClassName = EntityGenerator.GetTypeName(classMap);
            string sqlCommand      = "SELECT \" + c_rowFields + \""
                                     + " FROM `" + classMap.GetTableMap().Name + "`"
                                     + " WHERE " + whereQuery.ToString();

            file.WriteLine("		public virtual "+ entityClassName + " Find(" + findParams.ToString() + ")");
            file.WriteLine("		{");
            file.WriteLine("			"+ entityClassName + " result = new " + entityClassName + "();");
            file.WriteLine("			string command = \""+ sqlCommand + "\";");
            file.WriteLine();
            file.WriteLine("			m_state.ExecuteQuery(");
            file.WriteLine("				command,");
            file.WriteLine("				CommandBehavior.SingleRow,");
            file.WriteLine("				delegate(MySqlDataReader reader)");
            file.WriteLine("				{");
            file.WriteLine("					if (!reader.Read())");
            file.WriteLine("					{");
            file.WriteLine("						result = null;");
            file.WriteLine("					}");
            file.WriteLine("					else");
            file.WriteLine("					{");
            file.WriteLine("						FillEntityWithRow(ref result, reader);");
            file.WriteLine("					}");
            file.WriteLine("				}");
            file.WriteLine("			);");
            file.WriteLine();
            file.WriteLine("			return result;");
            file.WriteLine("		}");
            file.WriteLine();
        }