我正在尝试使用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。
你能告诉我这样做的解决方案是什么,或者还有其他方法可以做到这一点?
希望你明白我的意思。
感谢。
答案 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
,有一个代码字符串辅助方法来生成类似的东西。