EF 4.1,Code-First:有没有简单的方法来删除所有约定?

Sla*_*uma 14 .net entity-framework ef-code-first entity-framework-4.1

我们可以这样删除单个约定:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>();
// and 31 conventions more
Run Code Online (Sandbox Code Playgroud)

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

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

Lad*_*nka 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `Add`是内部方法.您可以通过反射访问它,但这不是很好的方式 - 任何未来的版本都可能会破坏您的代码. (2认同)