Преобразование текста и поиск сущности во множественном числе (коллекция)

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

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

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

Спасибо!

Ричард


person Richard    schedule 23.06.2011    source источник


Ответы (3)


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

person Dave    schedule 03.07.2011
comment
что, если я установил другое имя для EntitySet в файле edmx. потерпеть неудачу! - person Mickey Perlstein; 26.07.2012
comment
Я не исследовал, может ли это быть проблемой (это звучит логично и, следовательно, вполне вероятно, так и есть), но я не думаю, что это вообще конструктивно — вставлять отказ в ваш ответ таким образом (ну, это грубо, на мой взгляд, но другие может не согласиться). В духе SO, почему бы вместо этого не придумать решение? Таким образом, мы все узнаем что-то интересное? - person Richard; 27.07.2012
comment
Мне пришлось избавиться от этого материала code.escape(entity), чтобы я мог использовать ViewDataTypeShortName для своих конкретных нужд, но в остальном это работало как шарм, История => Истории - person Dylan Hayes; 11.03.2016
comment
У меня отлично сработало, заменив code.escape моим собственным значением. - person Jason W; 22.03.2017

Как только вы получите свой «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
}
person Tim    schedule 08.09.2011
comment
Чтобы получить объект, используйте: string multipleizedName = entitySet.Name; - person Ravi Ram; 05.03.2014

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

   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();
}
person Community    schedule 26.07.2012