2016-04-14 18 views
0

Tüm varlıkları (modelleri) almaya çalışıyorum ve yalnızca ICollection türünde gezinme özellikleri var, ancak çalışmıyor gibi görünüyor, şu ana kadar denedim,Tüm varlıkları ve gezinme özelliklerini bulun

foreach (var propertyInfo in new CompanyDBContext().GetType() 
        .GetProperties(
          BindingFlags.Public 
          | BindingFlags.Instance)) 
{ 
    Console.WriteLine(propertyInfo.Name); 

    //var entity = DbSet<propertyInfo.Name> 
} 

ben yukarıdaki kodu kullanarak tüm modellerini almak mümkün, ama nasıl gelecek ICollection türüdür tüm seyir özelliklerini alabilirim?

+0

Bu, daha önce burada sorulmuştur: http://stackoverflow.com/questions/17886725/ef5-how-to-get-list-of-navigation-prope ries-for-a-domain-object –

+0

@WicherVisser evet, ama zaten varlıkları var, ben propertyInfo sahip olduğu gibi, ben propertyInfo nesnelere nasıl dönüştürebilirim emin değilim, aynı zamanda sadece ICOLections seçmek için nasıl emin değilim sadece – Mathematics

+0

oluşturma PropertyInfo kullanan bir türün örneği de daha önce yapıldı: http://stackoverflow.com/questions/15641339/create-new-propertyinfo-object-on-the-fly –

cevap

1

DbContext'dan tüm varlık türlerini ilk almalısınız. DbContext içinde tanımlanan DbSet<> türünde herhangi bir özellik aslında bir varlığı kapsıyor. Bunun yerine onu almalısın.

:
private static readonly Type DbSetType = typeof(DbSet<>); 
private static IEnumerable<Type> GetAllEntityTypes(Type contextType) 
{ 
    return contextType.GetProperties(BindingFlags.Public | BindingFlags.Instance) 
     .Select(p => p.PropertyType) 
     .Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == DbSetType) 
     .Select(t => t.GetGenericArguments()[0]); 
} 

Ve

Entity türünden Navigasyon özelliklerini almak için, buraya tarafın bütün navigasyon özellikleri DbContext içinde tanımlanmış https://stackoverflow.com/a/27124251/2509344

private static readonly MethodInfo CreateObjectSetMethodInfo = typeof(ObjectContext).GetMethod("CreateObjectSet", new Type[0]); 
private static readonly Type CollectionType = typeof(ICollection<>); 
private static IEnumerable<PropertyInfo> GetNavigationProperties(DbContext context, Type entityType) 
{ 
    var objectContext = ((IObjectContextAdapter)context).ObjectContext; 
    var createObjectSetMethod = CreateObjectSetMethodInfo.MakeGenericMethod(entityType); 
    var entity = createObjectSetMethod.Invoke(objectContext, new object[0]); 

    var entitySet = (EntitySet)entity.GetType().GetProperty("EntitySet").GetValue(entity); 
    var elementType = entitySet.ElementType; 
    return elementType.NavigationProperties.Select(p => entityType.GetProperty(p.Name)) 
     // Filter Properties that are of type ICollection 
     .Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == CollectionType); 
} 

sürümünü değiştirilir Ve nihayet almak için bir yardımcı yöntemdir

var context = new CompanyDBContext(); 
var entities = GetAllEntityTypes(context.GetType()); 
foreach (var entity in entities) 
{ 
    var navigationProperties = GetNavigationProperties(context, entity).ToList(); 
} 
İlgili konular