14

我们可以通过这种方式删除单个约定:

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

但我想念类似的东西modelBuilder.Conventions.RemoveAll()。有没有一种简单的方法可以删除所有这些?

(我什至不确定我是否真的想最终删除所有约定。但是随着我不断增长的对象模型,我很难清楚地区分映射到数据库的哪些部分来自约定,以及我确实在 Fluent 中明确配置了哪些部分API。我认为目前我混合了基于纯约定的映射、明确覆盖的约定和明确复制的约定。至少出于学习目的和对映射的清晰理解,能够关闭所有约定会很好。)

4

1 回答 1

12

我只是用反射创建了一些解决方案:

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);
        }
    }
}
于 2011-03-20T19:26:05.137 回答