2

T4テンプレートを使用してMVC3のカスタムスキャフォールダーを作成し、パラメーターとしてスキャフォールダーに渡されるデータベースとテーブルの削除ストアドプロシージャをスキャフォールディングしました。スキャフォールダーを実行すると、出力ファイルが正しい場所に作成されますが、次のエラーが発生します。

Invoke-ScaffoldTemplate:「UpdateCustomerCoupon.sql」を追加できません。その名前のファイルはすでに存在します。行:1でchar:23 + param($ c、$ a)は。を返します。<<<< $ 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

パッケージマネージャーコンソールに「 ScaffoldDeleteSQL-DatabaseName$ DatabaseName -TableName $ TableName 」と入力して、scaffolderを呼び出します。

また、次のような-Forceオプションを使用してscaffolderを呼び出してみました: " Scaffold DeleteSQL -DatabaseName $ DatabaseName -TableName $TableName-Force "。また、「-Forcetrue 」と「-Force:true を使用しましたが、運がありませんでした。また、$ Forceパラメーターがとにかくtrueに設定されていることに注意してください。したがって、デフォルトで上書きする必要があると思いますよね?

このエラーを取り除くために何をする必要がありますか?

助けてくれてありがとう。

4

1 に答える 1

4

問題は、出力が生成されたパスに関係しているようです。

PowerShellスクリプトで次の行を変更しました。

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

これに:

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

私が変更したのは、スラッシュを「/」から「\」に変更したことだけです。これで、エラーメッセージは表示されなくなりました。

于 2012-05-21T21:38:09.057 に答える