使用T4获取实体映射表名称

时间:2013-03-25 22:15:57

标签: entity-framework t4

我正在尝试使用T4为以下代码生成代码:

public virtual IList<Frequency> GetAll()
    {
        using (var wc = new WCDataClassesDataContext())
        {
            return wc.Frequencies.ToList();
        }
    }

    public virtual IList<Frequency> GetAll(Expression<Func<Frequency, bool>> whereClause)
    {
        using (var wc = new WCDataClassesDataContext())
        {
            return wc.Frequencies.Where(whereClause).ToList();
        }
    }

在T4我正在使用:

foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
    fileManager.StartNewFile(entity.Name + "BaseFinder.cs");
    BeginNamespace(code);
 #>

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
using System.Linq;
using System.Linq.Expressions;
<#=codeStringGenerator.EntityClassOpening(entity)#>
{

    public virtual IList<<#=entity.Name #>> GetAll()
    {
        using (var wc = new WCDataClassesDataContext())
        {
            return wc.[[Frequencies]].ToList();
        }
    }

    public virtual IList<<#=entity.Name #>> GetAll(Expression<Func<<#=entity.Name #>, bool>> whereClause)
    {
        using (var wc = new WCDataClassesDataContext())
        {
            return wc.[[Frequencies]].Where(whereClause).ToList();
        }
    }

......
}

而不是[[Frequencies]]我想要实体映射到的主表名。 我正在尝试设置各种可以在课堂上轻松使用的getter。

你能告诉我这样做的解决方案是什么,或者还有其他方法可以做到这一点?

希望你明白我的意思。

感谢。

1 个答案:

答案 0 :(得分:0)

看起来你已经拥有了实体类型,所以我认为你很接近 - 所有你需要做的就是获得关系多重性很多的导航属性,你应该设置。

类似的东西:

EntityType et = entity.GetType();
foreach(var navProp in et.NavigationProperties.Where(np=>np.DeclaringType == et 
        && np.RelationshipMultiplicity == RelationshipMultiplicity.Many))
{
    string s = string.Format("public virtual IList<{0}> GetAll() ...", 
                           navProp.ToEndMember.GetEntityType().Name);

}

实体框架DB-first生成器已经有了这种风格;如果你在EDMX下挖掘,你应该看到*.Context.tt或类似的东西。在那里,搜索NavigationProperty,有一个代码字符串辅助方法来生成类似的东西。