Отражение для построения списка EntityTypeConfiguration для Entity Framework CPT5 - PullRequest
6 голосов
/ 08 декабря 2010

Я не хочу добавлять каждый класс отображения вручную в ModelBuilder (), поэтому пытался использовать мои ограниченные знания отражения для их регистрации.Это то, что у меня есть, и это ошибка, которую я получаю:

КОД:

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;
        }

ОШИБКА: Ошибка 2 Типаргументы для метода 'System.Data.Entity.ModelConfiguration.Configuration.ConfigurationRegistrar.Add (System.Data.Entity.ModelConfiguration.EntityTypeConfiguration)' не могут быть выведены из использования.Попробуйте указать аргументы типа явно.C: \ root \ development \ plays \ PostHopeProject \ PostHope.Infrastructure.DataAccess \ DatabaseFactory.cs 67 17 PostHope.Infrastructure.DataAccess

Ответы [ 2 ]

12 голосов
/ 08 декабря 2010

Оригинальный ответ:

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

Подробности предполагаемого решения:

В приведенной выше статье показано, что вы можете использовать ключевое слово dynamic, чтобы обойти проверку типов времени компиляции и, таким образом, обойти ограничение попытки добавить конфигурацию в общий метод Add() DbModelBuilder. Вот быстрый пример:

// 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);
}

Подробнее об этом ключевом слове можно узнать в MSDN

1 голос
/ 08 декабря 2010

Ваш var configuration относится к типу Type, а не к типу EntityTypeConfiguration.Вам нужно предоставить методу Add экземпляр EntityTypeConfiguration, предположительно основанный на вашем текущем типе: configuration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...