Пользовательский скаффолдер 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"
Единственное, что я изменил, это косые черты от "/" до "\". Теперь я больше не получаю сообщение об ошибке.