Преобразование текста и поиск множественного числа сущностей (коллекция) - PullRequest
13 голосов
/ 23 июня 2011

Если у меня есть шаблон .tt, я могу использовать entity.Name, чтобы записать имя объекта, например:

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

Используя обычные преобразования или T4, Как выписать фактическое имя набора сущностей? (Например, для Персона это могут быть Персоны, но, возможно, я изменил его на Люди в конструкторе, поэтому я бы хотел этого).

Спасибо!

Richard

Ответы [ 3 ]

15 голосов
/ 03 июля 2011

Я искал ответ на тот же вопрос и обнаружил, что это не так уж плохо.Однако вместо получения имени 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) наимя вашей переменной, хранящей имя сущности.

И это все!

Источники:
Существуют ли какие-либо ограничения на то, какие библиотеки можно импортировать в шаблон t4? http://vthornheart.railsplayground.net/blog/archives/655

5 голосов
/ 08 сентября 2011

После того, как вы получили "ItemCollection" из метода "CreateEdmItemCollection", возьмите контейнер сущностей по умолчанию, и вы можете получить имена ваших 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 голосов
/ 26 июля 2012

вы можете найти эти полезные:

   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();
}
...