Подтвердить что ты не робот

Трансформации текста и поиск множественности объектов (коллекции)

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

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

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

Спасибо!

Ричард

4b9b3361

Ответ 1

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

Ответ 2

Как только вы получите свой "ItemCollection" из метода "CreateEdmItemCollection", возьмите контейнер 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
}

Ответ 3

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

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