diff --git a/app/controllers/repositories/lfs_api_controller.rb b/app/controllers/repositories/lfs_api_controller.rb
index b8c5970e088aff05bf6447496ad5d18b3091826d..5f0186c5c9bb76e71ab0f4495ca315bea232d81a 100644
--- a/app/controllers/repositories/lfs_api_controller.rb
+++ b/app/controllers/repositories/lfs_api_controller.rb
@@ -133,7 +133,7 @@ def upload_actions(object)
 
     # Overridden in EE
     def upload_http_url_to_repo
-      project.http_url_to_repo
+      Gitlab::RepositoryUrlBuilder.build(repository.full_path, protocol: :http)
     end
 
     def upload_headers
@@ -196,7 +196,7 @@ def link_to_project!(object)
 
       return unless lfs_object
 
-      LfsObjectsProject.link_to_project!(lfs_object, project)
+      LfsObjectsProject.link_to_project!(lfs_object, project, repo_type.name)
 
       Gitlab::AppJsonLogger.info(
         message: "LFS object auto-linked to forked project",
diff --git a/app/controllers/repositories/lfs_storage_controller.rb b/app/controllers/repositories/lfs_storage_controller.rb
index e545f63bfd797783c4a182b135c2e859fd2effdf..d40ae7d23fc29535c1619e46786b3d304aa7f4bf 100644
--- a/app/controllers/repositories/lfs_storage_controller.rb
+++ b/app/controllers/repositories/lfs_storage_controller.rb
@@ -45,7 +45,8 @@ def upload_finalize
         oid: oid,
         size: size,
         uploaded_file: uploaded_file,
-        project: project
+        project: project,
+        repository_type: repo_type.name
       )
 
       response = service.execute
diff --git a/app/models/lfs_objects_project.rb b/app/models/lfs_objects_project.rb
index 32beb6c795bd7693d530e1d63b8f95badfc6ba48..da63c0581cd27178b80462b7ea2f3c3008b06804 100644
--- a/app/models/lfs_objects_project.rb
+++ b/app/models/lfs_objects_project.rb
@@ -19,10 +19,8 @@ class LfsObjectsProject < ApplicationRecord
   scope :project_id_in, ->(ids) { where(project_id: ids) }
   scope :lfs_object_in, ->(lfs_objects) { where(lfs_object: lfs_objects) }
 
-  def self.link_to_project!(lfs_object, project)
-    # We can't use an upsert here because there is no uniqueness constraint:
-    # https://gitlab.com/gitlab-org/gitlab/-/issues/347466
-    self.safe_find_or_create_by!(lfs_object_id: lfs_object.id, project_id: project.id) # rubocop:disable Performance/ActiveRecordSubtransactionMethods
+  def self.link_to_project!(lfs_object, project, repository_type)
+    safe_find_or_create_by!(lfs_object_id: lfs_object.id, project_id: project.id, repository_type: repository_type) # rubocop:disable Performance/ActiveRecordSubtransactionMethods -- We can't use an upsert here because there is no uniqueness constraint: https://gitlab.com/gitlab-org/gitlab/-/issues/347466
   end
 
   def self.update_statistics_for_project_id(project_id)
diff --git a/app/services/lfs/finalize_upload_service.rb b/app/services/lfs/finalize_upload_service.rb
index 91a80dc9f7c6440860e294fa73fd1ff820a07680..6a84b9c58121ab8cdfe73a0fc245028391d20919 100644
--- a/app/services/lfs/finalize_upload_service.rb
+++ b/app/services/lfs/finalize_upload_service.rb
@@ -2,11 +2,12 @@
 
 module Lfs
   class FinalizeUploadService
-    def initialize(oid:, size:, uploaded_file:, project:)
+    def initialize(oid:, size:, uploaded_file:, project:, repository_type:)
       @oid = oid
       @size = size
       @uploaded_file = uploaded_file
       @project = project
+      @repository_type = repository_type
     end
 
     def execute
@@ -27,7 +28,7 @@ def execute
 
     private
 
-    attr_reader :oid, :size, :uploaded_file, :project
+    attr_reader :oid, :size, :uploaded_file, :project, :repository_type
 
     def service_response_error(reason, message)
       ServiceResponse.error(reason: reason, message: message)
@@ -42,7 +43,7 @@ def store_file!
         object = create_file!
       end
 
-      link_to_project!(object)
+      LfsObjectsProject.link_to_project!(object, project, repository_type)
     end
 
     def create_file!
@@ -54,12 +55,5 @@ def replace_file!(lfs_object)
       lfs_object.file = uploaded_file
       lfs_object.save!
     end
-
-    def link_to_project!(object)
-      LfsObjectsProject.safe_find_or_create_by!( # rubocop:disable Performance/ActiveRecordSubtransactionMethods -- Used in the original controller: https://gitlab.com/gitlab-org/gitlab/-/blob/3841ce47b1d6d4611067ff5b8b86dc9cbf290641/app/controllers/repositories/lfs_storage_controller.rb#L118
-        project: project,
-        lfs_object: object
-      )
-    end
   end
 end
diff --git a/ee/app/controllers/ee/repositories/lfs_api_controller.rb b/ee/app/controllers/ee/repositories/lfs_api_controller.rb
index 88ad3d922be1389b5bb172fb7ac39cb405fa7349..14039f960ec4362fe9b8daff5a276cb3d18499a6 100644
--- a/ee/app/controllers/ee/repositories/lfs_api_controller.rb
+++ b/ee/app/controllers/ee/repositories/lfs_api_controller.rb
@@ -21,7 +21,7 @@ def batch_operation_disallowed?
 
       override :upload_http_url_to_repo
       def upload_http_url_to_repo
-        return geo_primary_http_url_to_repo(project) if ::Gitlab::Geo.primary?
+        return geo_primary_http_url_to_repo(repository) if ::Gitlab::Geo.primary?
 
         super
       end
diff --git a/spec/models/lfs_objects_project_spec.rb b/spec/models/lfs_objects_project_spec.rb
index 9fde97a83ee22fda2fdcbe20e0529759b8a2b98c..91a236cac332a4abdf5e05e24ec7e8dc49deb63e 100644
--- a/spec/models/lfs_objects_project_spec.rb
+++ b/spec/models/lfs_objects_project_spec.rb
@@ -123,11 +123,17 @@
   end
 
   describe '#link_to_project!' do
+    let(:repository_type) { :project }
+
     it 'does not throw error when duplicate exists' do
       lfs_objects_project
 
       expect do
-        result = described_class.link_to_project!(lfs_objects_project.lfs_object, lfs_objects_project.project)
+        result = described_class.link_to_project!(
+          lfs_objects_project.lfs_object,
+          lfs_objects_project.project,
+          repository_type
+        )
         expect(result).to be_a(described_class)
       end.not_to change { described_class.count }
     end
@@ -137,7 +143,7 @@
 
       allow(ProjectCacheWorker).to receive(:perform_async).and_call_original
       expect(ProjectCacheWorker).to receive(:perform_async).with(new_project.id, [], %w[lfs_objects_size])
-      expect { described_class.link_to_project!(lfs_objects_project.lfs_object, new_project) }
+      expect { described_class.link_to_project!(lfs_objects_project.lfs_object, new_project, repository_type) }
         .to change { described_class.count }
 
       expect(described_class.find_by(
diff --git a/spec/services/lfs/finalize_upload_service_spec.rb b/spec/services/lfs/finalize_upload_service_spec.rb
index e75e60d9b4c2258aef1448867a447ac4f8abb329..3e1ea933dd608e0e2b676e45f47bb98d8f661222 100644
--- a/spec/services/lfs/finalize_upload_service_spec.rb
+++ b/spec/services/lfs/finalize_upload_service_spec.rb
@@ -38,7 +38,13 @@
   end
 
   subject(:service) do
-    described_class.new(oid: params[:oid], size: params[:size], uploaded_file: uploaded_file, project: project).execute
+    described_class.new(
+      oid: params[:oid],
+      size: params[:size],
+      uploaded_file: uploaded_file,
+      project: project,
+      repository_type: :project
+    ).execute
   end
 
   describe '#execute' do