Лучший подход к игнорированию классов при использовании сначала кода и структуры сущностей.

В настоящее время я делаю следующее, чтобы удалить все классы EF, которые я не хочу включать. Но это означает, что я должен перечислить все классы.

 protected override void OnModelCreating(DbModelBuilder AModelBuilder)
{
    // Remove any classes that we don't want in the database. These are our derived classes
    AModelBuilder.Ignore<TCompetition>();
    AModelBuilder.Ignore<TCompeitionLadder>();
    AModelBuilder.Ignore<TCompeitionPersonRole>();
    AModelBuilder.Ignore<TCountry>();
    AModelBuilder.Ignore<TSport>();
    AModelBuilder.Ignore<TVenue>();
}

Поэтому вместо этого я подумал, что буду использовать отражение, чтобы получить список типов в сборке, а затем удалить все ссылки на классы, которые я не хочу включать. Однако я не могу заставить это работать, поскольку объект Type не является ожидаемым типом ссылки на класс, необходимым для Ignore(). Может ли кто-нибудь указать мне в правильном направлении, пожалуйста?

 protected override void OnModelCreating(DbModelBuilder AModelBuilder)
{
     // Remove any classes that we don't want in the database. These are our derived classes
    Assembly objAssembly = Assembly.GetExecutingAssembly();
    foreach (Type objType in objAssembly.GetTypes())
    {
        if (objType.BaseType.FullName.StartsWith("TEntityFramework", true, null))
        {
            AModelBuilder.Ignore<objType>();
        }
    }
}

person TheEdge    schedule 09.08.2011    source источник


Ответы (1)


Используйте отражение для вызова универсальной функции,

Вместо того, чтобы писать это:

AModelBuilder.Ignore<objType>();

Напишите это:

MethodInfo method = typeof(DbModelBuilder).GetMethod("Ignore");
MethodInfo generic = method.MakeGenericMethod(objType);
generic.Invoke(AModelBuilder, null);
person Kamyar Infinity    schedule 09.08.2011
comment
Я получаю сообщение об ошибке: Не удалось найти имя типа или пространства имен «AModelBuilder» (вы пропустили директиву использования или ссылку на сборку?) для: MethodInfo method = typeof(AModelBuilder).GetMethod(Ignore); - person TheEdge; 09.08.2011
comment
Моя ошибка. Я неправильно понял ваши типы, я отредактировал код, протестируйте новый - person Kamyar Infinity; 09.08.2011