Entity framework 文本转换&;查找实体复数(集合)

Entity framework 文本转换&;查找实体复数(集合),entity-framework,entity-framework-4,t4,css,Entity Framework,Entity Framework 4,T4,Css,如果我有一个.tt模板,我可以使用entity.Name写出一个实体的名称,例如: foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) {; WriteLine(entity.Name); } foreach(ItemCollection.GetItems().OrderBy(e=>e.Name)中的EntityType实体) {; Wri

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

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{;
    WriteLine(entity.Name); 
}
foreach(ItemCollection.GetItems().OrderBy(e=>e.Name)中的EntityType实体)
{;
WriteLine(实体名称);
}
使用普通转换或T4,如何写出实体集的实际名称?(例如,对于Person,它可能是Persons,但可能我在designer中将其更改为Person,所以我希望改为Persons)

谢谢


理查德

我在寻找同一个问题的答案,结果发现还不错。但是,使用同一个复数形式非常容易,而不是获取EntitySet名称

在文本模板的顶部添加以下行:

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

这允许您创建一个pluralizer实例,如下所示:

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

然后,要使模板中的实体多元化,只需使用以下命令:

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

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

就这样

资料来源:

从“CreateEdmItemCollection”方法获取“ItemCollection”后,抓取默认实体容器,您可以从中派生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
}
EdmItemCollection ItemCollection=loader.CreateEdmItemCollection(inputFile);
EntityContainer容器=ItemCollection.GetItems().FirstOrDefault();
foreach(ItemCollection.GetItems().OrderBy(e=>e.Name)中的EntityType实体)
{
EntitySetBase entitySet=container.BaseEntitySets.FirstOrDefault(set=>set.ElementType==entity);

string pluralizedName=entitySet.Name;//您可能会发现以下内容很有用:

   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();
}
string GetEntitySetName(string entityName,EntityContainer容器)
{
var list=container.BaseEntitySets.OfType();
var l=list.Where(f=>f.ElementType.Name==entityName);
字符串setname=l.Select(c=>c.Name).FirstOrDefault();
返回setname??string.Empty;
}
字符串GetEntitySetName(System.Data.Metadata.Edm.EdmType实体,EntityContainer容器)
{
字符串名称=GetAllBaseClasses(entity).Last();
var out=GetEntitySetName(名称,容器);
退出;
}
字符串[]GetAllBaseClasses(System.Data.Metadata.Edm.EdmType实体,int From=0)
{
列表类型=新列表();
类型.添加(实体.名称);
while(entity.BaseType!=null)
{
添加(entity.BaseType.Name);
实体=实体.BaseType;
}
返回类型.Skip(From).ToArray();
}

如果我在edmx中为EntitySet设置了一个不同的名称,该怎么办?失败!我还没有调查这是否是一个问题(听起来合乎逻辑,因此很可能是),但我认为在你的答案中添加这样的失败是没有建设性的(嗯,我认为这很粗鲁,但其他人可能不同意).本着这样的精神,为什么不想出一个解决方案呢?这样我们都能学到一些有趣的东西?我必须摆脱那些代码。逃避(实体)我可以使用ViewDataTypeShortName来满足我的特定需求,但除此之外,它就像一个符咒,History=>Histories通过用我自己的值交换code.escape对我来说非常有用;