/// <summary>
        /// Must implement this method
        /// </summary>
        /// <param name="insertHistoryOperation"></param>
        protected override void Generate(InsertHistoryOperation insertHistoryOperation)
        {

            Contract.Requires(insertHistoryOperation != null);

            using (var writer = Writer())
            {

                writer.Write("INSERT INTO \"dbo\".");

                writer.Write(Name(insertHistoryOperation.Table));

                writer.Write(" ({0}, {1}, {2})", Quote("MigrationId"), Quote("Model"), Quote("ProductVersion"));

                writer.Write(" VALUES (");

                writer.Write(Generate(insertHistoryOperation.MigrationId));

                writer.Write(", ");

                writer.Write(Generate(insertHistoryOperation.Model));

                writer.Write(", ");

                writer.Write(Generate(insertHistoryOperation.ProductVersion));

                writer.Write(")");


                Statement(writer);

            }

        }
        public void Can_get_and_set_properties()
        {
            var model = new byte[] { 0xDA };

            var insertHistoryOperation
                = new InsertHistoryOperation("Foo", "Migration1", model);

            Assert.Equal("Foo", insertHistoryOperation.Table);
            Assert.Equal("Migration1", insertHistoryOperation.MigrationId);
            Assert.Same(model, insertHistoryOperation.Model);
        }
        protected virtual MigrationStatement Generate(InsertHistoryOperation op)
        {
            if (op == null) return null;

              StringBuilder sb = new StringBuilder();
              StringBuilder model = new StringBuilder();

              foreach (byte item in op.Model)
            model.Append(item.ToString("X2"));

            #if NET_45_OR_GREATER
              sb.Append("insert into `" + op.Table + "` (`migrationId`, `model`, `productVersion`) ");
              sb.AppendFormat(" values ( '{0}', '{1}', '{2}') ",
                      op.MigrationId,
                      "0x" + model.ToString(),
                      op.ProductVersion);
            #else
              sb.Append("insert into `" + op.Table + "` (`migrationId`, `createdOn`, `model`, `productVersion`) ");
              sb.AppendFormat(" values ( '{0}', '{1}', {2}, '{3}' ) ",
                      op.MigrationId,
                      op.CreatedOn.ToString("yyyy-MM-dd hh:mm:ss"),
                      "0x" + model.ToString(),
                      op.ProductVersion);
            #endif
              return new MigrationStatement { Sql = sb.ToString() };
        }
        public void Generate_can_output_insert_history_statement()
        {
            var migrationProvider = new SqlServerMigrationSqlGenerator();

            var insertHistoryOperation
                = new InsertHistoryOperation(
                    "Foo",
                    "Migration1",
                    new byte[] { 0xBE, 0xEF }
                    );

            var sql =
                migrationProvider.Generate(
                    new[] { insertHistoryOperation },
                    "2008").Join(s => s.Sql, Environment.NewLine);

            var expectedVersion = FileVersionInfo.GetVersionInfo(typeof(DbMigrator).Assembly.Location).ProductVersion;

            Assert.True(
                sql.Contains(
                    "INSERT INTO [Foo] ([MigrationId], [Model], [ProductVersion]) VALUES ('Migration1', 0xBEEF, '" + expectedVersion + "')"));
        }
    protected virtual MigrationStatement Generate(InsertHistoryOperation op)
    {

      if (op == null) return null;

      StringBuilder sb = new StringBuilder();
      StringBuilder model = new StringBuilder();

      model.Append(BitConverter.ToString(op.Model).Replace("-", ""));

      sb.Append("insert into `" + TrimSchemaPrefix(op.Table) + "` (`migrationId`, `model`, `productVersion`) ");
      sb.AppendFormat(" values ( '{0}', {1}, '{2}') ",
                      op.MigrationId,
                      "0x" + model.ToString(),
                      op.ProductVersion);

      return new MigrationStatement { Sql = sb.ToString() };
    
    }
        /// <summary>
        ///     Generates SQL for a <see cref = "InsertHistoryOperation" />.
        ///     Generated SQL should be added using the Statement method.
        /// </summary>
        /// <param name = "insertHistoryOperation">The operation to produce SQL for.</param>
        protected virtual void Generate(InsertHistoryOperation insertHistoryOperation)
        {
            Contract.Requires(insertHistoryOperation != null);

            using (var writer = Writer())
            {
                writer.Write("INSERT INTO ");
                writer.Write(Name(insertHistoryOperation.Table));
                writer.Write(" ([MigrationId], [Model], [ProductVersion])");
                writer.Write(" VALUES (");
                writer.Write(Generate(insertHistoryOperation.MigrationId));
                writer.Write(", ");
                writer.Write(Generate(insertHistoryOperation.Model));
                writer.Write(", ");
                writer.Write(Generate(insertHistoryOperation.ProductVersion));
                writer.Write(")");

                Statement(writer);
            }
        }