2016-06-28 25 views
1

Ich versuche, eine Liste aller Beziehungen „Fremdschlüssels“ programmatisch auf einem Modell zu erhalten (Schlüssel, damit verbundene Ziel, fremden Spaltennamen.)Wie erhalten Sie eine Liste aller Entity Relation in Entity Framework 6.1?

ich this other question gefunden, die die gleiche Sache zu sein scheint. Aber ich kann den Code in der Antwort nicht für mich arbeiten lassen.

Hier ist, was ich

public List<string> GetObjectRelations(Type type) 
    { 

     var metadata = ((IObjectContextAdapter)this.context).ObjectContext.MetadataWorkspace; 

     // Get the part of the model that contains info about the actual CLR types 
     var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace)); 

     var fk = metadata.GetItems<AssociationType>(DataSpace.CSpace).Where(a => a.IsForeignKey); 

     //check if the table has any foreign constraints for that column 
     var fkname = fk.Where(x => x.ReferentialConstraints[0].ToRole.Name == type.Name).Where(x => x.ReferentialConstraints[0].ToProperties[0].Name == type.Name); 

     //Get the corresponding reference entity column name 
     return fkname.Select(x => x.ReferentialConstraints[0].FromProperties[0].Name).ToList(); 

    } 

hier getan haben, ist, wie ich nennen diese Methode

var relations = QueryExtractor.GetObjectRelations(typeof(TSource)); 

Aber dieser Code funktioniert nicht für mich. Der Rückgabewert ist leer.

Wie kann ich den Fremdschlüssel und das Objekt, auf das sie bezogen sind, korrekt ermitteln?

AKTUALISIERT

Hier ist meine aktuellen Code basiert auf muratgu unten beantworten. Aber es ist jetzt noch mir gibt eine Liste der Beziehungen

public List<Dictionary<string, object>> GetObjectRelations(Type type) 
    { 
     var relations = new List<Dictionary<string, object>>(); 

     var metadata = ((IObjectContextAdapter)this.context).ObjectContext.MetadataWorkspace; 

     var fk_all = metadata.GetItems<AssociationType>(DataSpace.CSpace).Where(a => a.IsForeignKey); 

     var fk_out = fk_all.Where(x => x.ReferentialConstraints[0].ToRole.Name == type.Name).ToList(); // relations going out 

     foreach (var fk in fk_out) 
     { 
      var relation = new Dictionary<string, object>(); 

      var fk_ref = fk.ReferentialConstraints[0]; //How can a foreign key relation have more than one column? 

      var objectName = fk_ref.FromRole.Name; 

      var attributeName = fk_ref.FromProperties[0].Name; 

      relation.Add(objectName, attributeName); 

      relations.Add(relation); 
     } 

     return relations; 
    } 
+0

Sagen wir 'Entity2' einen Fremdschlüssel namens' Fk1', die auf 'Entity1' verweist. 'Id', was möchtest du auf dieser Liste sehen? – muratgu

+0

Ich möchte den Fremdschlüssel "ie ClientId" sehen und ich möchte auch das Objekt wissen, dass es auf "ie" Client "zeigt und ich möchte den Fernschlüssel" ie Id " – Jaylen

Antwort

1

Sie haben bereits alles, was Sie in Ihrem Code-Snippet müssen, obwohl ich eine Ahnung haben, dass eine Liste von Strings Rückkehr werde nicht sein genug für dich. Ich werde es abbrechen, damit Sie entscheiden können, was mit den Ergebnissen zu tun ist.

 // assume Child has a foreign key (Parent_Id) to Parent (Id) 
     // assume primary keys are not composite 
     var type = typeof(Child); 
     var fk_all = metadata.GetItems<AssociationType>(DataSpace.CSpace).Where(a => a.IsForeignKey); 
     var fk_out = fk_all.Where(x => x.ReferentialConstraints[0].ToRole.Name == type.Name).ToList(); // relations going out 
     foreach(var fk in fk_out) { // could be many 
      var fk_ref = fk.ReferentialConstraints[0]; // what if more than one? 
      Console.WriteLine("From {0} - {1} ", fk_ref.FromRole.Name, fk_ref.FromProperties[0].Name); 
      Console.WriteLine("To {0} - {1} ", fk_ref.ToRole.Name, fk_ref.ToProperties[0].Name); 
     } 

Child Unter der Annahme hat einen Fremdschlüssel Parent_Id-Parent (Id), ist dieser Druck wird:

 From Parent - Id 
     To Child - Parent_Id 
+0

Vielen Dank dafür. Ich entschuldige mich hat mich eine Weile gedauert, um es testen zu können: Die fk_all gibt ein Objekt zurück aber die fk_out Zeile gibt 0 Datensätze zurück Ich werde meine Frage jetzt mit meinem letzten Code aktualisieren – Jaylen