2012-06-19 59 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 #>"); 
<# 
} 
#>