我们可以通过这种方式删除单一约定:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<ConcurrencyCheckAttributeConvention>();
// and 31 conventions more
但我想念modelBuilder.Conventions.RemoveAll()
之类的东西。是否有一种简单的方法可以删除所有这些?
(我甚至不确定我是否真的想要最终删除所有约定。但是随着我不断增长的对象模型,我很难清楚地区分映射到DB的哪些部分来自约定以及我确实明确配置了哪些部分在Fluent API。我认为目前我混合了基于纯约定的映射,明确覆盖的约定和明确的转换约定。至少为了学习目的和清晰的映射理解,能够关闭所有约定会很好。 )
答案 0 :(得分: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);
}
}
}