Я пытаюсь получить список всех отношений «внешних ключей» на модели программно (ключи, связанный объект, иностранное имя столбца.)Как получить список всех отношений Entity в Entity Framework 6.1?
Я нашел this other question который, кажется, делает то же самое. Но я не могу получить код в ответе на работу для меня.
Вот что я сделал
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();
}
Вот как я называю этот метод
var relations = QueryExtractor.GetObjectRelations(typeof(TSource));
Но этот код не работает для меня. Возвращаемое значение пуст.
Как я могу правильно получить внешний ключ и объект, с которым они связаны?
ОБНОВЛЕНО
Вот мой текущий код, основанный на muratgu ответить ниже. Но это все еще теперь дает мне список отношений
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;
}
Допустим 'Entity2' имеет внешний ключ с именем' Fk1', что указывает на 'Entity1'. 'Id', что вы хотите увидеть в этом списке? – muratgu
Я хочу видеть внешний ключ «ie ClientId», а также хочу знать объект, на который он указывает «т.е.« Клиент », и я хочу знать удаленный ключ« ie Id » – Jaylen