Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net EF 4.1,代码优先:是否有一种简单的方法可以删除所有约定?_.net_Entity Framework_Ef Code First_Entity Framework 4.1 - Fatal编程技术网

.net EF 4.1,代码优先:是否有一种简单的方法可以删除所有约定?

.net EF 4.1,代码优先:是否有一种简单的方法可以删除所有约定?,.net,entity-framework,ef-code-first,entity-framework-4.1,.net,Entity Framework,Ef Code First,Entity Framework 4.1,我们可以通过以下方式删除单个约定: modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>(); // and 31 conventions more modelBuilder.Conventions.Remove(); modelBuilder.Conve

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

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>();
// and 31 conventions more
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
//还有31项公约
但是我错过了类似于
modelBuilder.Conventions.RemoveAll()
的东西。有没有一种简单的方法可以将它们全部移除


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

我只是创建了一些带有反射的解决方案:

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);
        }
    }
}
公共类上下文:DbContext
{
私有静态IList_types=typeof(IConvention).Assembly.GetTypes()
.Where(t=>!t.isastract&&t.IsClass&&
类型(IConvention).IsAssignableFrom(t))
.ToList();
私有静态MethodInfo\u方法=
typeof(ConventionsConfiguration).GetMethod(“删除”);
//数据库集。。。
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
foreach(变量类型在_类型中)
{
MethodInfo method=\u method.MakeGenericMethod(类型);
调用(modelBuilder.Conventions,null);
}
}
}

谢谢,太好了!这将有助于MS集成RemoveAll(如果他们集成了RemoveAll的话。另外,在删除所有内容后,只激活特定约定时,
Add
会丢失)。
Add
是一种内部方法。您可以通过反射来访问它,但这不是一种很好的方法-任何未来的版本都可能会阻止您的代码。