I'm using EntityFramework.CodeTemplates.CSharp to reverse engineer the tables in my database (code first from database).
Some of my tables a prefixed with a with the text "table_" and I want to remove that from the generated context and pocos.
In the Context.cs.t4 and EntityType.cs.t4 I am able to make the changes I want to the generated c# code, but I can't see how to change the generated file name itself.
I am left with files like - table_Order.cs
and table_OrderItem.cs
Here is the code within EntityType.cs.t4
<#@ template visibility="internal" linePragmas="false" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="Microsoft.Data.Entity.Design" #>
<#@ assembly name="EntityFramework" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="Microsoft.Data.Entity.Design.CodeGeneration" #>
<#@ parameter type="System.Data.Entity.Core.Metadata.Edm.EntitySet" name="EntitySet" #>
<#@ parameter type="System.Data.Entity.Infrastructure.DbModel" name="Model" #>
<#@ parameter type="System.String" name="Namespace" #>
<#
var code = new CSharpCodeHelper();
var edm = new EdmHelper(code);
if (EntitySet == null)
{
throw new ArgumentNullException("EntitySet");
}
if (Model == null)
{
throw new ArgumentNullException("Model");
}
var entityType = EntitySet.ElementType;
#>
namespace <#= Namespace #>
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
<#
var typeConfigurations = edm.GetConfigurations(EntitySet, Model).OfType<IAttributeConfiguration>();
foreach (var typeConfiguration in typeConfigurations)
{
#>
<#= code.Attribute(typeConfiguration) #>
<#
}
#>
public partial class <#= code.Type(entityType) #>
{
<#
var collectionProperties = from p in entityType.NavigationProperties
where p.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many
select p;
if (collectionProperties.Any())
{
#>
public <#= code.Type(entityType) #>()
{
<#
foreach (var collectionProperty in collectionProperties)
{
#>
<#= code.Property(collectionProperty) #> = new HashSet<<#= code.Type(collectionProperty.ToEndMember.GetEntityType()) #>>();
<#
}
#>
}
<#
}
var first = true;
foreach (var property in entityType.Properties)
{
if (!first)
{
WriteLine(string.Empty);
}
else
{
first = false;
}
var propertyConfigurations = edm.GetConfigurations(property, Model).OfType<IAttributeConfiguration>();
foreach (var propertyConfiguration in propertyConfigurations)
{
#>
<#= code.Attribute(propertyConfiguration) #>
<#
}
#>
public <#= code.Type(property) #> <#= code.Property(property) #> { get; set; }
<#
}
foreach (var navigationProperty in entityType.NavigationProperties)
{
if (!first)
{
WriteLine(string.Empty);
}
else
{
first = false;
}
#>
public virtual <#= code.Type(navigationProperty) #> <#= code.Property(navigationProperty) #> { get; set; }
<#
}
#>
}
}
Just edit the t4 template and edit the file name manually. For example where it says:
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
you can change that to:
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
var entityName = entity.Name;
if(entityName.StartWith("table_")) entityName = entityName.Replace("table_", string.Empty);
fileManager.StartNewFile(entityName + ".cs");
EDIT
Sorry, I didn't realise you were using the powertools template.
You may have to do this manually after running the templates. In my case I've added something similar to the end of my template creation:
DirectoryInfo di = new DirectoryInfo("");
var files = di.GetFiles("table_*.cs");
foreach (var fi in files.ToArray())
{
fi.MoveTo(fi.FullName.Replace("table_",string.Empty));
}
Ultimately, you might be better off with this extension
Edit 2
It appears it still isn't possible to customise the output file name when reverse engineering code first!
Sorry.