/// <summary>
        /// Reads the web service description documents.
        /// </summary>
        /// <param name="serviceDto">The service dto.</param>
        /// <param name="reader">The reader.</param>
        private static void ReadWebServiceDescriptionDocuments(WebServiceDescriptionDto serviceDto, IDataReader reader)
        {
            reader.NextResult();

            while (reader.Read())
            {
                var documentDto = new WebServiceDescriptionDocumentDto
                                      {
                                          Id = reader.GetInt32(0),
                                          DocumentType =
                                              (WebServiceDescriptionDocumentType)
                                              Enum.Parse(
                                                  typeof(WebServiceDescriptionDocumentType), reader.GetString(1), true),
                                          Data = reader.GetString(2),
                                          Hash = reader.GetString(3)
                                      };

                serviceDto.Documents.Add(documentDto);
            }
        }
        /// <summary>
        /// Inserts the web service description.
        /// </summary>
        /// <param name="dto">The dto.</param>
        /// <exception cref="System.ArgumentNullException">dto</exception>
        /// <exception cref="System.Data.DBConcurrencyException">
        /// </exception>
        public void InsertWebServiceDescription(WebServiceDescriptionDto dto)
        {
            const string InsertServiceCommandText = @"
INSERT INTO [dbo].[WebServiceDescriptions]
(
    [Guid]
)
VALUES
(
    @guid
);

SET @id = SCOPE_IDENTITY();";

            const string InsertDocumentCommandText = @"
INSERT INTO [dbo].[WebServiceDescriptionsWebServiceDocuments]
(
     [ServiceId]
    ,[DocumentId]
)
VALUES
(
     @serviceId
    ,@documentId
);";

            if (dto == null)
                throw new ArgumentNullException("dto");

            using (var ctx = ConnectionManager<SqlConnection>.GetManager(Database.VeyronMeta, false))
            {
                using (var cmd = new SqlCommand(InsertServiceCommandText, ctx.Connection))
                {
                    var idParam = cmd.Parameters.Add("@id", SqlDbType.Int);

                    idParam.Direction = ParameterDirection.Output;

                    cmd.Parameters.AddWithValue("@guid", dto.Guid);

                    var rowsAffected = cmd.ExecuteNonQuery();

                    if (rowsAffected == 0)
                        throw new DBConcurrencyException(ConcurencyException);

                    dto.Id = (int)idParam.Value;
                }

                using (var cmd = new SqlCommand(InsertDocumentCommandText, ctx.Connection))
                {
                    cmd.Parameters.AddWithValue("@serviceId", dto.Id);
                    var documentIdParam = cmd.Parameters.Add("@documentId", SqlDbType.Int);

                    foreach (var document in dto.Documents)
                    {
                        documentIdParam.Value = document.Id;

                        var rowsAffected = cmd.ExecuteNonQuery();

                        if (rowsAffected == 0)
                            throw new DBConcurrencyException(ConcurencyException);
                    }
                }
            }
        }
        /// <summary>
        /// Gets the web service description.
        /// </summary>
        /// <param name="id">The identifier.</param>
        /// <returns>WebServiceDescriptionDto.</returns>
        public WebServiceDescriptionDto GetWebServiceDescription(int id)
        {
            const string CommandText = @"
SELECT [Id]
      ,[Guid]
FROM [dbo].[WebServiceDescriptions]
WHERE [Id] = @id

SELECT [Id]
      ,[DocumentType]
      ,[Data]
      ,[Hash]
FROM [dbo].[WebServiceDescriptionDocuments] sdd
	INNER JOIN [dbo].[WebServiceDescriptionsWebServiceDocuments] j ON j.[DocumentId] = sdd.Id
WHERE j.[ServiceId] = @id";

            using (var ctx = ConnectionManager<SqlConnection>.GetManager(Database.VeyronMeta, false))
            {
                using (var cmd = new SqlCommand(CommandText, ctx.Connection))
                {
                    cmd.Parameters.AddWithValue("@id", id);

                    using (var reader = new SafeDataReader(cmd.ExecuteReader()))
                    {
                        if (reader.Read())
                        {
                            var dto = new WebServiceDescriptionDto { Id = reader.GetInt32(0), Guid = reader.GetGuid(1) };

                            ReadWebServiceDescriptionDocuments(dto, reader);

                            return dto;
                        }
                    }
                }
            }

            return null;
        }