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;
}
Sagen wir 'Entity2' einen Fremdschlüssel namens' Fk1', die auf 'Entity1' verweist. 'Id', was möchtest du auf dieser Liste sehen? – muratgu
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