private void Update(DatabaseObject obj)
        {
            if (obj.NewlyCreated)
            {
                throw new InvalidOperationException("Update of object newly created.");
            }

            if (!obj.Dirty)
            {
                return;
            }

            obj.Validate();

            var updates = string.Join(", ",
                                      obj.Fields.Where(f => f.Dirty)
                                      .Select(f => f.ColumnName + " = " + f.VariableName));

            using (var command = Command("UPDATE {0} SET {1} WHERE id = @id", TableName(obj.GetType()), updates))
            {
                command.AddParam("@id", obj.Id.Value);

                foreach (var f in obj.Fields)
                {
                    if (f.Dirty)
                    {
                        f.AddValue(command);
                    }
                }

                command.ExecuteNonQuery();
            }

            obj.Updated();
        }
        private void Insert(DatabaseObject obj)
        {
            if (!obj.NewlyCreated)
            {
                throw new InvalidOperationException("Insert of object not newly created.");
            }

            obj.Validate();

            var columns   = string.Join(", ", obj.Fields.Select(f => f.ColumnName));
            var variables = string.Join(", ", obj.Fields.Select(f => f.VariableName));

            using (var command = Command("INSERT INTO {0} ({1}) VALUES ({2})", TableName(obj.GetType()), columns, variables))
            {
                foreach (var f in obj.Fields)
                {
                    f.AddValue(command);
                }

                command.ExecuteNonQuery();
            }

            obj.Updated();
        }