禁用EF6中的所有约定

今天我已经有了,甚至可能在EF6内置约定方面遇到更多问题。 通过调试,我看到代码首先EF6启用所有可用的默认约定。

由于我使用映射器类生成了一个好看的模型映射,我只是不希望约定改变我的数据模型。

具体来说,我无法运行简单的SELECT查询,因为当FK列被正确映射为linkedentity并且我没有理由在我的数据库中使用不同的名称时,进入SQL的虚假列Extent1.LinkedEntity_id

为清晰起见:这个代码优先模型是从DB-first反向设计的。 数据库规则和我无法改变其设计。

问题:如何一次禁用所有约定? 似乎我在DbModelBuilder.Conventions找不到.Clear方法

没有本地方法可以删除它们。 但是,有可能使用reflection。 找到所有约定,然后调用删除它们。 这样的事情应该有所帮助:

  private void RemoveAllConventions(DbModelBuilder modelBuilder) { var conventions = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes().Where(t => t.IsClass && t.GetInterface("IConvention") != null)); var remove = typeof(ConventionsConfiguration).GetMethods().Where(m => m.Name == "Remove" && m.ContainsGenericParameters).First(); foreach (var item in conventions) { try { remove.MakeGenericMethod(item).Invoke(modelBuilder.Conventions, null); } catch (Exception) { } } } 

然后在你的OnModelCreating中:

  protected override void OnModelCreating(DbModelBuilder modelBuilder) { RemoveAllConventions(modelBuilder); } 

随意迭代这个概念并报告您的发现。