2015-05-12 4 views
0

Я новичок в EF и попал в блокпост. Я пытаюсь получить список свойств навигации для типов сущностей, которые основаны на базовом типе. Я собирался использовать ....Свойства навигационной структуры Entity Framework на производных типах

ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext; 
var entitySetElementType = objectContext.CreateObjectSet<DerivedType>().EntitySet.ElementType; 
foreach(var navigationProperty in entitySetElementType.NavigationProperties) 
{ //need PropertyInfo here} 

Здесь я узнал, что не могу получить ObjectSet производного типа. Исключение брошено является

«Там нет EntitySets, определенного для указанного типа объекта „SurveyDALv2.Model.Correspondence“. Если „SurveyDALv2.Model.Correspondence“представляет собой производный типа, используйте базовый тип вместо «.

Я понимаю, что я могу получить ObjectQuery для производных сущностей с использованием

objectContext.CreateObjectSet<BaseType>().OfType<DerivedType>() 

Но это не поможет с получением списка навигационных свойств (если я не хватает чего-то). Я не вижу, как получить доступ к EntitySet.NavigationProperties для производного типа сущности.

Любая помощь очень ценится.

+0

Никогда не пробовал с основным контекстом, но вы можете попробовать это: 'CreateObjectSet () .OfType ()' вместо 'CreateObjectSet ()'? –

+0

Спасибо, но я ищу список свойств навигации, определенных для объекта производного типа. Этот (http://stackoverflow.com/questions/17886725/ef5-how-to-get-list-of-navigation-properties-for-a-domain-object отлично подходит для получения списка свойств навигации, если только он не является производным (ответ от marsman) – Michael

ответ

0

Мне удалось сделать следующий код работы, я надеюсь, что это вам поможет.

ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext; 
    EntityContainer container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace); 

    //Only works if you keep the default entity associations names pattern 
    //ie: ClassName.NavigationProperty 
    var t = container.AssociationSets.Where(a => a.Name.Contains(typeof(DerivedType).Name)); 

    foreach (AssociationSet navigationProperty in t) 
    { 
     String p = navigationProperty.Name; 
     var propInfo = typeof(DerivedType).GetProperty(p.Substring(typeof(DerivedType).Name.Length+1)); 
    } 
+0

Это похоже на работу с большинством моих классов сущностей, но у меня есть некоторые имена сущностей, которые расширяют другие имена сущностей. У меня есть класс корреспонденции и класс корреспонденции, а также класс CorrespondenceChainItem. Таким образом, мои имена классов не позволяют «Where (a => a.Name.Contains» возвращать только правильные набор ассоциаций. T – Michael

+0

Это помогает. Я действительно просто пытаюсь открыть и снова подключить свойства сущности для контекста перед добавлением и сохранением изменений. Я добавляю дубликаты сущностей при добавлении, потому что я работаю с изолированным контекстом. Я просто напишу некоторые специфичные для типа вещи, чтобы прикрепить свойства навигации I знаете, существуют. Спасибо – Michael

+0

Учитывая, что вы - имена классов, вы могли бы использовать что-то вроде 'Where (a => a.Name.Contains (typeof (DerivedType) .Name +". "))' note: '.'may заменить ben на a_ _ в строке. В любом случае, если у вас возникли проблемы с дублированием сущностей, возможно, вы не вернете свою сущность правильным способом (с включением для ленивой загрузки), и я думаю, вы не добавили FK propertytie s к вашей модели, позволяющей загружать ваши свойства навигации в соответствии с их известным FK. –

1
public EntityType ElementType(Type entityType) 
{ 
    var type = ObjectContext.GetObjectType(entityType); 
    var objectContext = ((IObjectContextAdapter)this).ObjectContext; 
    EntityType elementType; 
    if (objectContext.MetadataWorkspace.TryGetItem(type.FullName, DataSpace.OSpace, out elementType)) 
    { 
     return elementType; 
    } 
    return null; 
} 
Смежные вопросы