【问题标题】:EF Code First Reverse Engineering Customized templates (EF Power Tools Beta 2 )EF Code First 逆向工程定制模板(EF Power Tools Beta 2)
【发布时间】:2012-06-19 14:45:11
【问题描述】:

我正在从现有的 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"].Value ?? ""),但值始终为 null ! 这可能意味着逆向工程代码优先工具不会将值提供给模板主机。我可能会结束解析 edmx 文件。待续。

【问题讨论】:

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


    【解决方案1】:

    我查看了电动工具附带的 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 #>");   
    <#   
    }
    #>
    

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多