1

我正在尝试使用 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]] 我想要实体映射到的主表名。我正在尝试设置可以在课堂上轻松使用的各种吸气剂。

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

希望你明白我的意思。

谢谢。

4

1 回答 1

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 下四处挖掘,您应该会看到 a*.Context.tt或类似的东西。在那里,搜索NavigationProperty,有一个代码字符串辅助方法来生成类似的东西。

于 2013-03-27T23:38:24.750 回答