EF Code First逆向工程定制模板(EF Power Tools Beta 2)

时间:2012-06-19 14:45:12

标签: entity-framework-4 ef-code-first t4

我正在从现有的pgsql数据库生成POCO。

我想将生成的POCO放入一个自己的C#类库和DbContext并映射到一个 不同的项目,以便我的POCO没有任何与EF相关的任何内容。

我正在尝试修改Context.tt模板以在OnModelCreating()期间在运行时指定表模式,因为在生成的实体上使用[Table]属性会引入到EF库的硬链接。

我的问题是我目前无法从当前的EnitySet中检索架构名称。 以下是迄今为止我所做的摘录:

var efHost = (EfTextTemplateHost)Host;

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
<#
foreach (var set in efHost.EntityContainer.BaseEntitySets.OfType<EntitySet>())
{
#>
  modelBuilder.Configurations.Add(new <#= set.ElementType.Name #>Map());
  modelBuilder.Entity<<#= set.ElementType.Name #>>().ToTable("<#= set.Name #>", "<#=????#>");
<#
}
#>
    }

此时唯一可用的对象是 EfTextTemplateHost 的实例。

感谢任何帮助。

TIA。

编辑:我找到了修改架构的方法(set.MetadataProperties [“Schema”]。值??“”),但值始终为null! 这可能意味着Reverse Enginering Code First工具不会为模板主机提供值。我可能会结束解析edmx文件。继续。

1 个答案:

答案 0 :(得分:0)

我查看了电动工具附带的mapping.tt文件,它通过这样做得到了架构:

var tableSet = efHost.TableSet;
var tableName = (string)tableSet.MetadataProperties["Table"].Value
    ?? tableSet.Name;
var schemaName = (string)tableSet.MetadataProperties["Schema"].Value;
你可以做类似的事吗?也许这个(我自己也没试过):

<#   
foreach (var set in efHost.EntityContainer.BaseEntitySets.OfType<EntitySet>())   
{
#>   
    modelBuilder.Configurations.Add(new <#= efHost.TableSet.MetadataProperties[set.ElementType.Name].Value #>Map());   
    modelBuilder.Entity<<#= efHost.TableSet.MetadataProperties[set.ElementType.Name].Value #>>().ToTable("<#= set.Name #>", "<#=efHost.TableSet.MetadataProperties[set.ElementType.Name].Value #>");   
<#   
}
#>