0

我正在从现有的 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 文件。未完待续。

4

1 回答 1

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 #>");   
<#   
}
#>
于 2012-08-30T17:04:03.720 回答