Пользовательский скаффолдер MVC3/T4 выдает ошибку "файл существует", даже если файл не существует

Я написал пользовательский скаффолдер для MVC3 с использованием шаблонов T4 для скаффолдинга хранимой процедуры удаления базы данных и таблицы, передаваемой в скаффолдер в качестве параметров. Когда я запускаю скаффолдер, выходной файл создается в правильном месте, но я получаю следующую ошибку:

Invoke-ScaffoldTemplate: невозможно добавить UpdateCustomerCoupon.sql. Файл с таким именем уже существует. В строке:1 символ:23 + param($c, $a) return . <<<< $c @a + CategoryInfo: NotSpecified: (:) [Invoke-ScaffoldTemplate], COMException + FullyQualifiedErrorId: T4Scaffolding.Cmdlets.InvokeScaffoldTemplateCmdlet

Неважно, существует ли файл в месте вывода или нет. Я получаю эту ошибку каждый раз.

Вот скрипт PowerShell для скаффолдера:

[T4Scaffolding.Scaffolder(Description = "Enter a description of DeleteSQL here")][CmdletBinding()]
param(
    [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$DatabaseName,
    [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$TableName,
    [string]$Project,
    [string]$CodeLanguage,
    [string[]]$TemplateFolders,
    [switch]$Force = $true
)

$outputPath = "Scripts/SQL/$TableName/Delete$TableName"

Add-ProjectItemViaTemplate $outputPath -Template DeleteSQLTemplate `
    -Model @{ TableName = $TableName; DatabaseName = $DatabaseName; Project = $Project } `
    -SuccessMessage "Added DeleteSQL output at {0}" `
    -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$Force

Write-Host "Scaffolded DeleteSQL"

А вот код шаблона T4:

<#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" Debug="True" #>
<#@ Output Extension="sql" #>
<#@ assembly name="System.Collections" #>
<#@ assembly name="System.Configuration" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Web" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Configuration" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Web" #>
USE [<#= Model.DatabaseName #>]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Delete<#= Model.TableName #>] (
    @P<#= Model.TableName #>ID AS BIGINT,
    @PChangedByUserID BIGINT,
    @PChangedByURL VARCHAR(1024),
    @PChangedByIpAddress varchar(16)
)
AS
    SET NOCOUNT ON

    BEGIN TRY
        BEGIN TRANSACTION
            -- update user history
            DECLARE @userHistoryID BIGINT = 0;
            DECLARE @details VARCHAR(4096) = '[<#= Model.TableName #>] ID ''' + CAST(@P<#= Model.TableName #>ID AS VARCHAR) + ''' was deleted.'
            EXEC InsertUserHistory @PChangedByUserID, @details, @PChangedByURL, @PChangedByIpAddress, @userHistoryID OUTPUT

            -- Rollback transaction if user history was not created
            IF(@userHistoryID = 0) BEGIN
                ROLLBACK
                SELECT CAST(-1 AS INT)
                RETURN
            END

            DELETE FROM
                [<#= Model.TableName #>]
            WHERE
                [ID] = @P<#= Model.TableName #>ID
        COMMIT

        SELECT CAST(1 AS INT)
    END TRY
    BEGIN CATCH
        ROLLBACK
        SELECT CAST(-2 AS INT)
    END CATCH

    RETURN

Я вызываю скаффолдер, набирая " Scaffold DeleteSQL -DatabaseName $ DatabaseName -TableName $ TableName " в консоли диспетчера пакетов.

Я также попытался вызвать скаффолдер с опцией -Force, например: " Скаффолд DeleteSQL -DatabaseName $ DatabaseName -TableName $ TableName -Force ". Я также использовал " -Force true " и " -Force: true " без удачи. Также обратите внимание, что параметр $Force в любом случае имеет значение true, поэтому я думаю, что он должен перезаписывать по умолчанию, верно?

Что мне нужно сделать, чтобы избавиться от этой ошибки?

Спасибо за помощь.

1 ответ

Решение

Похоже, проблема была связана с путем, к которому был генерирован вывод.

Я изменил эту строку в скрипте PowerShell:

$outputPath = "Scripts/SQL/$TableName/Delete$TableName"

к этому:

$outputPath = "Scripts\SQL\$TableName\Delete$TableName"

Единственное, что я изменил, это косые черты от "/" до "\". Теперь я больше не получаю сообщение об ошибке.

Другие вопросы по тегам