2

.edmx ファイルに基づいていくつかのクラスをスキャフォールディングする C# T4 テンプレートを作成しています。私が今必要としているのは、NavigationPropertyを介して、データベースに接続する列の名前にアクセスする方法です。

少し前に、特定の NavigationProperty のマッピングの詳細の下で、.edmx ビジュアル デザイナーでこの情報にアクセスできることに気付きました。 ここに画像の説明を入力

基本的に、T4 テンプレートの場合。必要な NavigationProperty のインスタンスが既にあります...接続するフィールドの名前を取得するにはどうすればよいですか? (WeatherOnMondaysこの場合)

4

4 に答える 4

3

回答: EF4: EDMX の NavigationProperty からリンクされた列名を取得する

これを達成する2つの方法:

// Obtain a reference to the navigation property you are interested in
var navProp = GetNavigationProperty();
// Load the metadata workspace
MetadataWorkspace metadataWorkspace = null;
bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace);

// Get the association type from the storage model
var association = metadataWorkspace
    .GetItems<AssociationType>(DataSpace.SSpace)
    .Single(a => a.Name == navProp.RelationshipType.Name)

// Then look at the referential constraints
var toColumns = String.Join(",", 
    association.ReferentialConstraints.SelectMany(rc => rc.ToProperties));
var fromColumns = String.Join(",", 
    association.ReferentialConstraints.SelectMany(rc => rc.FromProperties));

2番目のアプローチ:

NavigationProperty[] foreignKeys = entity.NavigationProperties
  .Where(np => np.DeclaringType == entity &&
          ((AssociationType)np.RelationshipType).IsForeignKey).ToArray();

foreach (NavigationProperty foreignKey in foreignKeys)
{
   foreach(var rc in GetSourceSchemaTypes<AssociationType>()
       .Single(x => x.Name == foreignKey.RelationshipType.Name)
       .ReferentialConstraints)
   {
       foreach(var tp in rc.ToProperties)
           WriteLine(tp.Name);
       foreach(var fp in rc.FromProperties)
           WriteLine(fp.Name);
   }
}
于 2012-07-30T23:29:11.843 に答える
0

このコードはより単純です。私のVisual Studio 2012 では問題なく動作します。 .microsoft.com/en-us/library/system.data.metadata.edm.referentialconstraint.aspx .

<#@ template language="C#" debug="true" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#
string inputFile = @"DomainModel.edmx";

MetadataLoader loader = new MetadataLoader(this);

EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
    foreach (NavigationProperty navProperty in entity.NavigationProperties)
    {
        AssociationType association = ItemCollection.GetItems<AssociationType>().Single(a => a.Name == navProperty.RelationshipType.Name);
        string fromEntity = association.ReferentialConstraints[0].FromRole.Name;
        string fromEntityField = association.ReferentialConstraints[0].FromProperties[0].Name;
        string toEntity = association.ReferentialConstraints[0].ToRole.Name;
        string toEntityField = association.ReferentialConstraints[0].ToProperties[0].Name;
    }
}

#>
于 2013-04-09T03:34:22.020 に答える
0

http://brewdawg.github.io/Tiraggo.Edmx/を参照してください。NuGet からインストールできます。すべてのマッピング、列ごとの低レベル SQL データ型など、すべての種類のものを含む、edmx ファイル内のすべてのメタデータを提供します。ページのサンプルを見て、それがいかに簡単かがわかります。

于 2013-09-23T01:27:07.197 に答える
0

がある場合NavigationProperty、それが接続するフィールドはプロパティToEndMemberFromEndMember

于 2012-07-30T08:03:48.343 に答える