禁用EF6中的所有约定

时间:2016-12-15 13:04:17

标签: c# entity-framework

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

由于我使用映射器类生成了一个外观漂亮的模型映射,我只是不希望某些约定改变我的数据模型。

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

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

问题:如何一次禁用所有约定?似乎我无法在linkedentity

中找到.Clear方法

1 个答案:

答案 0 :(得分:1)

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

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

随意更多地了解这个概念并报告您的发现。