2

私は、T4テンプレートを使ってMVC3用のカスタムスキャフォルダーを作成し、scaffolderにパラメータとして渡されたデータベースとテーブルのストアドプロシージャをスカフォールドにしました。私は、出力ファイルが正しい場所に作成されscaffolderを実行しますが、私は次のエラーを取得する場合:MVC3/T4カスタムスキャフォルダーは、ファイルが存在しなくてもエラーが発生する

Invoke-ScaffoldTemplate : Unable to add 'UpdateCustomerCoupon.sql'. A file with that name already exists. At line:1 char:23 + param($c, $a) return . <<<< $c @a + CategoryInfo : NotSpecified: (:) [Invoke-ScaffoldTemplate], COMException + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.InvokeScaffoldTemplateCmdlet

をファイル出力場所に存在するかどうかは関係ありません。毎回このエラーが出ます。ここで

はscaffolderのための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テンプレートのコードです:

私は " 足場DeleteSQL -databasename $データベース名を入力してscaffolderを呼び出す
<#@ 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 

- TableName $ TableName "をパッケージマネージャコンソールに追加します。 Scaffold DeleteSQL -DatabaseName $ DatabaseName -TableName $ TableName -Force "のように、-Forceオプションを指定してscaffolderを呼び出そうとしました。私も "- フォースの真の"と "- フォース:真の"を使用しました。とにかく$ Forceパラメータがtrueに設定されていることに注意してください。デフォルトで上書きする必要があると思います。

このエラーを取り除くには、何が必要ですか?

ありがとうございました。

答えて

4

出力が生成されたパスに問題があるように見えます。

私は、PowerShellスクリプトにこの行を変更:これに

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

を:

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

私が変更さ唯一の事は、 "\" を "/" からスラッシュました。今、私はもうエラーメッセージを取得しません。

関連する問題