@@ -298,68 +298,88 @@ private void Initialize(DbContext context)
298298 }
299299 }
300300 }
301-
301+
302+
303+ var entityTypes = context . GetObjectContext ( ) . MetadataWorkspace . GetItemCollection ( DataSpace . OSpace )
304+ . Where ( x => x . BuiltInTypeKind == BuiltInTypeKind . EntityType ) ;
305+
306+ foreach ( var entityType in entityTypes )
307+ {
308+ var typeField = entityType . GetType ( ) . GetField ( "_type" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
309+
310+ if ( typeField != null )
311+ {
312+ var type = ( Type ) typeField . GetValue ( entityType ) ;
313+ TryRegisterType ( context , type ) ;
314+ }
315+ }
316+
302317 foreach ( var type in QueryFilterManager . Types )
303318 {
304- var setMethod = context . GetType ( ) . GetMethod ( "Set" , new Type [ 0 ] ) ;
305- var dbSet = setMethod . MakeGenericMethod ( type ) . Invoke ( context , null ) ;
319+ TryRegisterType ( context , type ) ;
320+ }
321+ }
306322
307- Type elementType = type ;
323+ private void TryRegisterType ( DbContext context , Type type )
324+ {
325+ var setMethod = context . GetType ( ) . GetMethod ( "Set" , new Type [ 0 ] ) ;
326+ var dbSet = setMethod . MakeGenericMethod ( type ) . Invoke ( context , null ) ;
308327
309- // DbSet<>.InternalQuery
310- var internalQueryProperty = typeof ( DbQuery < > ) . MakeGenericType ( elementType ) . GetProperty ( "InternalQuery" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
311- var internalQuery = internalQueryProperty . GetValue ( dbSet , null ) ;
328+ Type elementType = type ;
312329
313- var entityTypebase = type . FullName ;
330+ // DbSet<>.InternalQuery
331+ var internalQueryProperty = typeof ( DbQuery < > ) . MakeGenericType ( elementType ) . GetProperty ( "InternalQuery" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
332+ var internalQuery = internalQueryProperty . GetValue ( dbSet , null ) ;
314333
315- try
316- {
317- // DbSet<>.InternalQuery.EntitySet
318- var entitySetProperty = internalQuery . GetType ( ) . GetProperty ( "EntitySet" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
319- var entitySet = ( EntitySet ) entitySetProperty . GetValue ( internalQuery , null ) ;
334+ var entityTypebase = type . FullName ;
320335
321- entityTypebase = entitySet . ElementType . FullName ;
322- }
323- catch
324- {
325- // Silence catch, it's k... it doesn't always exist!
326-
327- }
336+ try
337+ {
338+ // DbSet<>.InternalQuery.EntitySet
339+ var entitySetProperty = internalQuery . GetType ( ) . GetProperty ( "EntitySet" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
340+ var entitySet = ( EntitySet ) entitySetProperty . GetValue ( internalQuery , null ) ;
328341
329- // TypeByEntitySetBase
342+ entityTypebase = entitySet . ElementType . FullName ;
343+ }
344+ catch
345+ {
346+ // Silence catch, it's k... it doesn't always exist!
347+
348+ }
349+
350+ // TypeByEntitySetBase
351+ {
352+ if ( ! TypeByEntitySetBase . ContainsKey ( entityTypebase ) )
330353 {
331- if ( ! TypeByEntitySetBase . ContainsKey ( entityTypebase ) )
332- {
333- TypeByEntitySetBase . Add ( entityTypebase , elementType ) ;
334- }
354+ TypeByEntitySetBase . Add ( entityTypebase , elementType ) ;
335355 }
356+ }
336357
337- // TypeByDbSet
358+ // TypeByDbSet
359+ {
360+ var baseType = elementType ;
361+
362+ var types = new List < Type > ( ) ;
363+ while ( baseType != null && baseType != typeof ( object ) )
338364 {
339- var baseType = elementType ;
365+ types . Add ( baseType ) ;
340366
341- var types = new List < Type > ( ) ;
342- while ( baseType != null && baseType != typeof ( object ) )
367+ // LINK interface
368+ var interfaces = baseType . GetInterfaces ( ) ;
369+ foreach ( var @interface in interfaces )
343370 {
344- types . Add ( baseType ) ;
345-
346- // LINK interface
347- var interfaces = baseType . GetInterfaces ( ) ;
348- foreach ( var @interface in interfaces )
349- {
350- types . Add ( @interface ) ;
351- }
352-
353- baseType = baseType . BaseType ;
371+ types . Add ( @interface ) ;
354372 }
355373
356- // ENSURE all discting
357- types = types . Distinct ( ) . ToList ( ) ;
374+ baseType = baseType . BaseType ;
375+ }
358376
359- if ( ! TypeByDbSet . ContainsKey ( entityTypebase ) )
360- {
361- TypeByDbSet . Add ( entityTypebase , types ) ;
362- }
377+ // ENSURE all discting
378+ types = types . Distinct ( ) . ToList ( ) ;
379+
380+ if ( ! TypeByDbSet . ContainsKey ( entityTypebase ) )
381+ {
382+ TypeByDbSet . Add ( entityTypebase , types ) ;
363383 }
364384 }
365385 }
0 commit comments