2016-06-28 4 views
1

Я пытаюсь получить список всех отношений «внешних ключей» на модели программно (ключи, связанный объект, иностранное имя столбца.)Как получить список всех отношений 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; 
    } 
+0

Допустим 'Entity2' имеет внешний ключ с именем' Fk1', что указывает на 'Entity1'. 'Id', что вы хотите увидеть в этом списке? – muratgu

+0

Я хочу видеть внешний ключ «ie ClientId», а также хочу знать объект, на который он указывает «т.е.« Клиент », и я хочу знать удаленный ключ« ie Id » – Jaylen

ответ

0

основе this answer, вы можете использовать Entity Framework Mapping Api Extensions. Например, следующая строка возвращает внешние ключи для типа продукта:

string[] fks = context.Db<Product>().Fks.Select(fk => fk.PropertyName).ToArray(); 
1

Вы уже все, что нужно в вашем фрагменте кода, хотя у меня есть подозрение, что возвращает список строк не собирается быть достаточно для вас. Я сломаю его, так что вы можете решить, что делать с результатами.

 // 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 Предполагая, что имеет внешний ключ Parent_Id к Parent (Id), это будет печатать:

 From Parent - Id 
     To Child - Parent_Id 
+0

Спасибо за это. Прошу прощения. потребовалось некоторое время, чтобы проверить его. fk_all возвращает один объект, но строка fk_out возвращает 0 записей. Теперь я обновлю свой вопрос с помощью моего последнего кода – Jaylen

Смежные вопросы