EntityType 'является переменной, но используется как тип при использовании Reflection - PullRequest
3 голосов
/ 02 апреля 2019

Мне нужно зарегистрировать всю сущность в DbContext.

я создаю extention для автоматической регистрации всех сущностей с Reflection:

  public static void RegisterAllEntity<BaseType>(this DbModelBuilder builder, params Assembly[] assmblies)
    {
        IEnumerable<Type> types = assmblies.SelectMany(x => x.GetExportedTypes())
            .Where(x => x.IsClass && !x.IsAbstract && x.IsPublic && typeof(BaseType).IsAssignableFrom(x));

        foreach (Type EntityType in types)
            builder.Entity<EntityType>();
    }

но это показывает мне эту ошибку:

EntityType 'является переменной, но используется как тип

в этой строке:

    foreach (Type EntityType in types)
            builder.Entity<EntityType>();

в чем проблема? как я могу решить эту проблему ???

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Глядя на документацию, я думаю, что вы хотите использовать DbModelBuilder.RegisterEntityType вместо DbModelBuilder.Entity.Документация для первого говорит:

Этот метод предоставлен для удобства, чтобы позволить типам сущностей быть зарегистрированными динамически без необходимости использовать MakeGenericMethod для вызова обычного универсального метода Entity.

Таким образом, вместо builder.Entity<EntityType>(); вы бы вместо этого использовали builder.RegisterEntityType(EntityType);

Стоит отметить, что часто в подобных ситуациях существует неуниверсальный метод, который принимает объект Typeпоэтому, если вы в будущем столкнетесь с другими программами, проверьте этот неуниверсальный метод с параметром Type.

1 голос
/ 02 апреля 2019

Вы используете EntityType как переменную в цикле foreach, а EntityType как тип в builder.Entity<EntityType>(). Например, измените имя переменной с EntityType на entityType, чтобы компилятор C # мог понять ваш код

1 голос
/ 02 апреля 2019

Общие аргументы должны быть разрешены во время компиляции.Вам нужно использовать отражение, чтобы вызвать метод Entity в таком цикле.Пожалуйста, отметьте this anwser.

Пример использования

...
MethodInfo method = typeof(DbModelBuilder).GetMethod("Entity");
MethodInfo generic = method.MakeGenericMethod(EntityType);
generic.Invoke(builder, null);

EDIT:

Также как Крис упомянул , естьне нужно использовать отражение, потому что DbModelBuilder предоставляет RegisterEntityType метод, который принимает тип в качестве аргумента, например:

builder.RegisterEntityType(EntityType);

EDIT2: есть Крис ответ

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