2012-06-19 26 views
0

我正在从现有的pgsql数据库中生成POCO。EF代码优先逆向工程自定义模板(EF电动工具Beta 2)

我想把生成波苏斯到自己的C#类库和的DbContext和映射到不同的 项目,所以我的波苏斯没有全球化志愿服务青年到什么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 ??“”),但值始终为空! 这可能意味着反向工程代码优先工具不会将值赋予模板主机。我可能会结束解析一个edmx文件。未完待续。

回答

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 #>"); 
<# 
} 
#>