【问题标题】:EF 4.1, Code-First: Is there an easy way to remove ALL conventions?EF 4.1,代码优先:有没有一种简单的方法可以删除所有约定?
【发布时间】:2011-07-19 05:40:50
【问题描述】:

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

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

但我想念modelBuilder.Conventions.RemoveAll() 之类的东西。有没有一种简单的方法可以将它们全部删除?

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

【问题讨论】:

    标签: .net entity-framework ef-code-first entity-framework-4.1


    【解决方案1】:

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

    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);
            }
        }
    }
    

    【讨论】:

    • 谢谢,太好了!在 MS 集成 RemoveAll 之前,这将有所帮助(如果他们这样做了。此外,在删除所有内容后,还缺少一个 Add 用于仅激活特定约定。)
    • Add 是内部方法。您可以通过反射访问它,但这不是很好的方法 - 任何未来的版本都会破坏您的代码。
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 2010-09-12
    • 2010-10-25
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多