T4脚手架 - 如何检测可空类型

时间:2013-06-19 10:47:32

标签: powershell t4scaffolding

我试图通过加载另一个类作为模型来生成一个类,这里​​是类\我正在使用的模型

using System;
using System.Text;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;


namespace Sma.Domain.Model {

    public class Smartistdetails {
        public Smartistdetails() { }
        [Key]
        public int ArtistID { get; set; }
        public string BandName? { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }     
    }
}

正如您所看到的那样,有一些像public string BandName? { get; set; }这样的可空类型,这就是我遇到问题的地方。我成功地创建了输出类,但是当模型的属性可以为空时,我想检测它并采取相应的行动,我不知道该怎么做。

这是我的t4模板

<#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #>
<#@ Output Extension="cs" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System" #>
<#@ import namespace="EnvDTE" #>
<#@ assembly name="System.ComponentModel.DataAnnotations" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data.Entity" #>
<#@ assembly name="System.Data.Linq" #>
<#@ import namespace="System.Data.Linq.Mapping" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.Objects.DataClasses" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Text.RegularExpressions" #>

using System; 
using System.Collections.Generic; 
using System.Text; 
using FluentNHibernate.Mapping;
using Sma.Domain.Model; 
<#
   var modelType = (CodeType)Model.ModelType; 
   var modelName = modelType.Name; 
   var properties = modelType.VisibleMembers().OfType<CodeProperty>();      
   var primaryKeyProperty = modelType.VisibleMembers().OfType<CodeProperty>().Single(x => x.Name == Model.PrimaryKey);
#>

namespace <#= Model.Namespace #>.Mapping
{
    public class <#= Model.EntityName #>Map : ClassMap<<#= Model.EntityName #>> 
    {       
        public <#= Model.EntityName #>Map() {
        Table("<#= Model.EntityName #>");
        LazyLoad();     
<# var type = "";
var typeName = "";
foreach (var property in properties) 
{
type = GetType(property.Type); 
typeName = GetTypeName(property.Type);
if( isType(type) )
{
if( Model.PrimaryKey == property.Name )
{
#>
        Id(x => x.<#= property.Name #>).GeneratedBy.Identity().Column("<#= property.Name #>");
<#      
}
else
{
#>
        Map(x=>x.<#= property.Name #>).Column("<#= property.Name #>");      
<#}
}
else
{
#>
        References(x=>x.<#= property.Name #>);              
<#
}
}
#>      }
    }
}

<#+
    string GetType(EnvDTE.CodeTypeRef type)
    {                                                                                                                                             
        string str = "";
        if (type.UnderlyingTypeIs<byte>())
            str = "byte";
        else if (type.UnderlyingTypeIs<sbyte>())
            str = "sbyte";
        else if (type.UnderlyingTypeIs<int>())
            str = "int";
        else if (type.UnderlyingTypeIs<uint>())
            str = "uint";
        else if (type.UnderlyingTypeIs<short>())
            str = "short";
        else if (type.UnderlyingTypeIs<ushort>())
            str = "ushort";
        else if (type.UnderlyingTypeIs<DateTime>())
            str = "DateTime";
        else if (type.UnderlyingTypeIs<long>())
            str = "long";
        else if (type.UnderlyingTypeIs<ulong>())
            str = "ulong";
        else if (type.UnderlyingTypeIs<double>())
            str = "double";
        else if (type.UnderlyingTypeIs<bool>())
            str = "bool";
        else if (type.UnderlyingTypeIs<string>())
            str = "string";
        else if (type.UnderlyingTypeIs<decimal>())
            str = "decimal";
        else
            str = type.AsFullName.ToString();

        return str;
    }

    string GetTypeName(EnvDTE.CodeTypeRef type)
    {  
        string str = type.AsFullName.ToString();
        return str;
    }

    bool isType(string _type)
    {
        if( _type == "byte" ) return true;
        else if( _type == "sbyte" ) return true;
        else if( _type == "int" ) return true;
        else if( _type == "uint" ) return true;
        else if( _type == "short" ) return true;
        else if( _type == "ushort" ) return true;
        else if( _type == "DateTime" ) return true;
        else if( _type == "long" ) return true;
        else if( _type == "ulong" ) return true;
        else if( _type == "double" ) return true;
        else if( _type == "bool" ) return true;
        else if( _type == "string" ) return true;
        else if( _type == "decimal" ) return true;
        return false;
    }
#>

Map(x=>x.<#= property.Name #>).Column("<#= property.Name #>");之前我想检查属性是否可以为空,如果不是我想指定Map(x=>x.<#= property.Name #>).Column("<#= property.Name #>").NotNullable();

怎么做

这里就是我的.ps1 powershell脚本

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

$mynamespace = "Sma"
$projectFor = $mynamespace + ".Infrastructure.Data"
$namespace = $projectFor # (Get-Project $projectFor).Properties.Item("DefaultNamespace").Value
$outputPath =  "Mapping\" + $ModelType
Write-Host "Scaffolding $ModelType ExtMapping..."

$useModelFromProject = $mynamespace + ".Domain"
# get the modelType object from the name
$foundModelType = Get-ProjectType $ModelType -Project $useModelFromProject -BlockUi
$primaryKey = Get-PrimaryKey $ModelType -Project $useModelFromProject
$modelOutputPath = "Mapping\" + $ModelType + "Map"

Add-ProjectItemViaTemplate $modelOutputPath -Template ExtMapping `
    -Model @{ 
    Namespace = $namespace; 
    ModelType = [MarshalByRefObject]$foundModelType; 
    PrimaryKey = $primaryKey;
    EntityName = $ModelType } `
    -SuccessMessage "Added ExtMapping output at $projectFor" `
    -TemplateFolders $TemplateFolders -Project $projectFor -CodeLanguage $CodeLanguage -Force:$Force

1 个答案:

答案 0 :(得分:1)

(Get-ProjectType $ModelType).Children | Where-Object{ $_.Type.CodeType.Name -eq "Nullable"} | ForEach{"$($_.Name),$($_.Type.AsString)"}

此代码段将提取nullables并将其显示为$ ModelType中包含的类名称中的“PropetyName,NullableType”