文字转换&寻找实体复数(集合)

时间:2011-06-23 04:01:57

标签: entity-framework entity-framework-4 t4 css

如果我有.tt模板,我可以使用entity.Name来写出实体的名称,例如:

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{;
    WriteLine(entity.Name); 
}

使用正常转换或T4,如何写出实体集的实际名称? (例如,对于Person,它可能是人物 - 但也许我将其改为设计师中的People,所以我反而希望这样做。)

谢谢!

理查德

3 个答案:

答案 0 :(得分:15)

我一直在寻找同一个问题的答案,并发现它并不太糟糕。但是,不是获取EntitySet名称,而是使用相同的复数形式非常容易。

在文本模板中,可能位于顶部,添加以下行:

<#@ assembly name="System.Data.Entity.Design" #>
<#@import namespace="System.Data.Entity.Design.PluralizationServices" #>

这允许您创建一个多元化器实例:

<# PluralizationService pluralizer = PluralizationService.CreateService(System.Globalization.CultureInfo.CurrentCulture); #>

然后复制模板中的实体,只需使用:

<#=pluralizer.Pluralize(code.Escape(entity))#>

当然,您可以将code.Escape(entity)替换为存储实体名称的变量名称。

就是这样!

来源:
Are there any limitations on what libraries can be imported in a t4 template? http://vthornheart.railsplayground.net/blog/archives/655

答案 1 :(得分:5)

从“CreateEdmItemCollection”方法获取“ItemCollection”后,抓取默认的Entity Container,然后从中获取EntitySet名称...

EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
EntityContainer container = ItemCollection.GetItems<EntityContainer>().FirstOrDefault();

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
    EntitySetBase entitySet = container.BaseEntitySets.FirstOrDefault(set => set.ElementType == entity);

     string pluralizedName = entitySet.Name; //<--- Pluralized Name extracted
}

答案 2 :(得分:2)

您可能会发现这些有用:

   string GetEntitySetName(string entityName, EntityContainer container)
{

var list = container.BaseEntitySets.OfType<EntitySet>();
var l = list.Where( f=> f.ElementType.Name == entityName);
string setname = l.Select(c=>c.Name).FirstOrDefault();
return setname ?? string.Empty;
}

string GetEntitySetName(System.Data.Metadata.Edm.EdmType entity, EntityContainer container)
{
    string name = GetAllBaseClasses(entity).Last();
    var out_ = GetEntitySetName(name, container);
    return out_;
}
string[] GetAllBaseClasses(System.Data.Metadata.Edm.EdmType entity, int From = 0)
{
    List<string> types = new List<string>();
    types.Add(entity.Name);

    while (entity.BaseType != null)
    {

        types.Add(entity.BaseType.Name);

        entity = entity.BaseType;

    }

    return types.Skip(From).ToArray();
}