2011-03-19 15 views
8

की नेविगेशनप्रोपर्टी से लिंक किए गए कॉलम नाम प्राप्त करें I पीडीओ उत्पन्न कर रहे हैं (मान लें कि वे MyEntityObject के उप-वर्ग हैं) एक ईडीएमएक्स फ़ाइल से टी 4 टेम्पलेट का उपयोग करके।ईएफ 4: ईडीएमएक्स

  • MyTable1 (PrimaryKey: MyTable1ID)
  • MyTable2 (PrimaryKey: MyTable2ID)
  • MyTable3 (PrimaryKey: MyTable3ID)

मैं 3 संस्थाओं, जैसे है

इन इकाइयों में निम्नलिखित संबंध हैं:

MyTable1.MyTable1ID < => MyTable2.MyTable1ID

MyTable2.MyTable2ID < => MyTable3.MyTable2ID (MyTable2ID MyTable2 को विदेशी कुंजी है) (MyTable1ID MyTable1 को विदेशी कुंजी है)

या किसी अन्य दृश्य में:

MyTable1 < = MyTable2 < = MyTable3

मैं सभी विदेशी कुंजी संबंधों

NavigationProperty[] foreignKeys = entity.NavigationProperties.Where(np => np.DeclaringType == entity && ((AssociationType)np.RelationshipType).IsForeignKey).ToArray(); 
forewach (NavigationProperty foreignKey in foreignKeys) 
{ 
    // generate code.... 
} 

मेरे प्रश्न निकालना चाहते हैं: मैं स्तंभ नाम है कि दो संस्थाओं के बीच जुड़े हुए हैं कैसे निकाल सकते हैं?

कुछ इस तरह:

void GetLinkedColumns(MyEntityObject table1, MyEntityObject table2, out string fkColumnTable1, out string fkColumnTable2) 
{ 
    // do the job 
} 

उदाहरण

string myTable1Column; 
string myTable2Column; 
GetLinkedColumns(myTable1, myTable2, out myTable1Column, out myTable2Column); 

में परिणाम

myTable1Column = "MyTable1ID"; 
myTable2Column = "MyTable2ID"; 

उत्तर

5

पहले उत्तर काम करता है अपने विदेशी कुंजी कॉलम आपकी वैचारिक मॉडल में गुण के रूप में सामने आ रहा रहे हैं। साथ ही, GetSourceSchemaTypes() विधि केवल ईएफ के साथ शामिल कुछ टेक्स्ट टेम्पलेट्स में उपलब्ध है, इसलिए यह जानना उपयोगी है कि यह विधि क्या करती है।

आप हमेशा स्तंभ नाम जानना चाहते हैं, तो आप इस प्रकार भंडारण मॉडल से AssociationType लोड करने के लिए की आवश्यकता होगी:

// 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)); 

इस मामले में, लोडर एक MetadataLoader EF.Utility.CS में परिभाषित किया गया है .ttinclude और inputFile एक मानक स्ट्रिंग वैरिएबल है जो .edmx फ़ाइल का नाम निर्दिष्ट करता है। इन्हें पहले से ही आपके टेक्स्ट टेम्पलेट में घोषित किया जाना चाहिए।

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); 
    } 
} 
2

इस कोड को मेरी दृश्य स्टूडियो पर ठीक काम करता है 2012

<#@ 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; 
    } 
} 

#> 
संबंधित मुद्दे