0

既存の pgsql データベースから POCO を生成中です。

生成された POCO を独自の C# クラス ライブラリと DbContext に配置し、別のプロジェクトにマッピングして、POCO が EF 関連のものを参照しないようにしたいと考えています。

生成されたエンティティで [Table] 属性を使用すると、EF ライブラリへのハード リンクが導入されるため、Context.tt テンプレートを変更して、実行時に OnModelCreating() 中にテーブル スキーマを指定しようとしています。

私の問題は、現在の 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のインスタンスです。

どんな助けでも感謝します。

ティア。

編集: スキーマを取得する方法を見つけました (set.MetadataProperties["Schema"].Value ?? "") が、値は常に null です! これは、リバース エンジニアリング Code First ツールがテンプレート ホストに値を与えていないことを意味している可能性があります。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 に答える