C# 禁用EF6中的所有约定

C# 禁用EF6中的所有约定,c#,entity-framework,C#,Entity Framework,今天,我遇到了EF6内置约定的问题,可能还有更多的问题。通过调试,我看到CodeFirstEF6启用了所有可用的默认约定 因为我已经用mapper类生成了一个好看的模型映射,所以我不希望约定以某种方式改变我的数据模型 具体来说,当FK列正确映射为LinkedEntity并且我没有理由在数据库中使用其他名称时,我无法运行简单的SELECT查询,因为SQL中有一个伪列Extent1.LinkedEntity_id 为清晰起见:此代码优先模型是从DB优先反向工程的。数据库规则,我不能改变它的设计 问题

今天,我遇到了EF6内置约定的问题,可能还有更多的问题。通过调试,我看到CodeFirstEF6启用了所有可用的默认约定

因为我已经用mapper类生成了一个好看的模型映射,所以我不希望约定以某种方式改变我的数据模型

具体来说,当FK列正确映射为
LinkedEntity
并且我没有理由在数据库中使用其他名称时,我无法运行简单的
SELECT
查询,因为SQL中有一个伪列
Extent1.LinkedEntity_id

为清晰起见:此代码优先模型是从DB优先反向工程的。数据库规则,我不能改变它的设计


问题:如何一次禁用所有约定?似乎在
DbModelBuilder.Conventions
中找不到
.Clear
方法没有本地方法删除它们。但是,使用反射也可以做到这一点。找到所有约定,然后调用Remove。类似这样的事情应该会有所帮助:

private void RemoveAllConventions(DbModelBuilder modelBuilder)
{
var conventions=AppDomain.CurrentDomain.GetAssemblys()
.SelectMany(a=>a.GetTypes()。其中(t=>t.IsClass&&t.GetInterface(“IConvention”)!=null);
var remove=typeof(ConventionsConfiguration).GetMethods(),其中(m=>m.Name==“remove”&&m.ContainsGenericParameters).First();
foreach(约定中的var项)
{
尝试
{
remove.MakeGenericMethod(item).Invoke(modelBuilder.Conventions,null);
}
捕获(例外)
{
}
}
}
然后在OnModelCreating中:

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
移除所有约定(modelBuilder);
}

您可以在这个概念上进行更多的迭代,并报告您的发现。

如果数据库存在且无法更改,为什么要先使用代码?对我来说,这似乎是数据库的第一个例子,说来话长。基本上,我们维护的是一个产品,而不是一个项目。没有单一的数据库:必须在安装应用程序的每个客户站点部署、维护和迁移数据库。实际上,这是一个很长的故事,从使用两个不同的EF实用程序库的批量插入失败开始。事实上,在我将EDMX模型移植到代码之前,我没有遇到这个问题first@SefeCodeFirst是一个令人困惑的名称。您可以将DbContext API很好地用于已有的数据库。@magicandre1981:我知道。OP希望首先使用代码在客户机器上部署。至少我是这样得到的。嗨,这是我问题的正确解决方案(尽管我不得不做一些调整),但无论如何为了讨论,它并没有解决我的根本问题。我希望有一天能升级到EF7,但这意味着要重写