Прочитайте метаданные внешнего ключа программно с Entity Framework 4 - PullRequest
8 голосов
/ 08 декабря 2010

Кто-нибудь знает, как можно получить информацию о схеме из сгенерированной edmx Entity Framework?

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

EG: в моей схеме 2 класса: пользователь и группа. У меня есть число «42», которое, как я знаю, было получено из свойства «GroupId» объекта «Пользователь», но в настоящее время я не могу понять, как определить, что это свойство «GroupId» внешних ключей «Пользователь» сущность "Group" по свойству "GroupId".

Ответы [ 2 ]

23 голосов
/ 15 января 2011

Вы можете использовать следующий подход -

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
foreach (var entityMember in entity.NavigationProperties)
foreach (System.Data.Metadata.Edm.EdmProperty foreignKey in entityMember.GetDependentProperties())
{
    //... use foreignKey
}
8 голосов
/ 16 декабря 2010

Закончилось поиском решения этой проблемы.Соответствующую информацию можно найти в свойстве RelationshipManager контекста.Вызвав GetAllRelatedEnds(), а затем найдя единицы типа AssociationSet.

ElementType набора ассоциаций содержит свойство IsForeignKey, а также массив ReferentialConstraints, который имеет свойства для каждогоограничение ToRole, ToProperty, FromRole и FromProperty соответственно и RelationshipMultiplicity на ToRole / FromRole могут использоваться для определения направления взаимосвязи внешнего ключа.

Взяв все эти данные и используя метод контекста GetObjectByKey, я смог программно пройти через связи внешнего ключа, определенные для контекста, не имея связанной сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...