EF 4.1, Code-First: есть ли простой способ удалить ВСЕ соглашения? - PullRequest
14 голосов
/ 20 марта 2011

Мы можем удалить отдельные соглашения следующим образом:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>();
// and 31 conventions more

Но я скучаю по чему-то вроде modelBuilder.Conventions.RemoveAll(). Есть ли простой способ удалить ВСЕ из них?

(Я даже не уверен, действительно ли я хочу окончательно удалить все условные обозначения. Но с моей растущей объектной моделью у меня возникают трудности, чтобы четко отличить, какие части сопоставления с БД происходят из условных обозначений, а какие части я действительно настроил явно. в Fluent API. Я думаю, что в настоящее время у меня есть смесь чисто условных сопоставлений, явно перезаписанных условных обозначений и явно воспроизведенных условных обозначений. По крайней мере, для целей обучения и ясного понимания сопоставления было бы неплохо иметь возможность отключить ВСЕ условные обозначения. )

1 Ответ

12 голосов
/ 20 марта 2011

Я просто создаю какое-то решение с отражением:

public class Context : DbContext
{
    private static IList<Type> _types = typeof(IConvention).Assembly.GetTypes()
        .Where(t => !t.IsAbstract && t.IsClass && 
                    typeof(IConvention).IsAssignableFrom(t))
        .ToList();

    private static MethodInfo _method = 
        typeof(ConventionsConfiguration).GetMethod("Remove");

    // DbSets ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        foreach (var type in _types)
        {
            MethodInfo method = _method.MakeGenericMethod(type);
            method.Invoke(modelBuilder.Conventions, null);
        }
    }
}
...