2012-04-20 2 views
3

Есть ли способ узнать, является ли свойство объекта навигационным свойством, из его метаданных?entity framework проверить, является ли свойство навигационным свойством

Я могу определить, является ли свойство сущностью, проверяя, реализует ли он ICollection, и оттуда я могу заключить, что это свойство навигации.

Но что, если свойство не является сущностью, а относится только к другому объекту?

+1

Сделайте каждый объект реализацией AbstractEntity и выполните проверку (entity abstractEntity)? – Dante

ответ

5

Вы можете получить тип сущности O-Space EDM из MetdataWorkspace и обладать свойством NavigationProperties. Вот пример:

var workspace = ((IObjectContextAdapter) ctx).ObjectContext.MetadataWorkspace; 
var itemCollection = (ObjectItemCollection)(workspace.GetItemCollection(DataSpace.OSpace)); 
var entityType = itemCollection.OfType<EntityType>().Single(e => itemCollection.GetClrType(e) == typeof(MyEntity)); 
foreach(var navigationProperty in entityType.NavigationProperties) 
{ 
    Console.WriteLine(navigationProperty.Name); 
} 
+0

Да, похоже, это может сделать трюк, но я не нашел способ создать экземпляр system.data.metadata.edm.entitytype для определенного объекта. Его конструктор без параметров, и среди статических методов также нет ничего. –

+0

Я добавил код, показывающий, как это сделать. ctx в этом случае является DbContext. Если вы не используете CodeFirst, вам не нужен объект IObjectContextAdpater - свойство MetadataWorkspace будет находиться непосредственно в вашем контексте (полученное из ObjectContext) – Pawel

+0

Отлично. Огромное спасибо! –

1

Вы можете использовать еще один подход к решению проблемы.

// найденная переменная - это некоторый экземпляр объекта DbContext;

foreach (var propertyInfo in found.GetType().GetProperties()) 
{ 
    var reference = Context.Entry(found).Member(propertyInfo.Name) as DbReferenceEntry; 
    if(reference != null) 
    reference.Load(); 
} 

Надеюсь, этот образец вам поможет.

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