2010-12-08 22 views
5

Je ne veux pas avoir à ajouter manuellement chaque classe de mappage à ModelBuilder() alors j'essayais d'utiliser ma connaissance limitée de la réflexion pour les enregistrer. Voilà ce que j'ai, et c'est l'erreur que je reçois:Réflexion pour construire la liste de EntityTypeConfiguration pour Entity Framework CPT5

CODE:

private static ModelBuilder CreateBuilder() { 
      var contextBuilder = new ModelBuilder(); 
      IEnumerable<Type> configurationTypes = typeof(DatabaseFactory) 
       .Assembly 
       .GetTypes() 
       .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && !type.IsGenericType && typeof(EntityTypeConfiguration).IsAssignableFrom(type) && (type.GetConstructor(Type.EmptyTypes) != null)); 

      foreach (var configuration in configurationTypes.Select(type => (EntityTypeConfiguration)Activator.CreateInstance(type))) 
      { 
       contextBuilder.Configurations.Add(configuration); 
      } 

      return contextBuilder; 
     } 

ERREUR: Erreur 2 Les arguments de type pour la méthode « System.Data.Entity.ModelConfiguration .Configuration.ConfigurationRegistrar.Add (System.Data.Entity.ModelConfiguration.EntityTypeConfiguration) 'ne peut pas être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type. C: \ root \ développement \ jeux \ PostHopeProject \ PostHope.Infrastructure.DataAccess \ DatabaseFactory.cs 67 17 PostHope.Infrastructure.DataAccess

Répondre

11

réponse originale:

http://areaofinterest.wordpress.com/2010/12/08/dynamically-load-entity-configurations-in-ef-codefirst-ctp5/

Les détails de la solution implicite:

L'article référencé ci-dessus montre que vous pouvez utiliser le mot-clé dynamic pour contourner la compilation vérification du type de temps et contourner ainsi la restriction de tenter d'ajouter la configuration à la méthode générique Add() du DbModelBuilder. Voici un exemple rapide:

// Load all EntityTypeConfiguration<T> from current assembly and add to configurations 
var mapTypes = from t in typeof(LngDbContext).Assembly.GetTypes() 
       where t.BaseType != null && t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>) 
       select t; 

foreach (var mapType in mapTypes) 
{ 
    // note: "dynamic" is a nifty piece of work which bypasses compile time type checking... (urgh??) 
    //  Check out: http://msdn.microsoft.com/en-us/library/vstudio/dd264741%28v=vs.100%29.aspx 
    dynamic mapInstance = Activator.CreateInstance(mapType); 
    modelBuilder.Configurations.Add(mapInstance); 
} 

Vous pouvez en savoir plus sur l'utilisation de ce mot-clé on MSDN

1

Votre var configuration est de type Type, ce qui est de type EntityTypeConfiguration. Vous devrez fournir à la méthode Add une instance de EntityTypeConfiguration, vraisemblablement en fonction de votre type actuel: configuration.