今天我已经有了EF6内置约定,并且可能还有更多问题。通过调试,我看到代码首先EF6启用了所有可用的默认约定。
由于我使用映射器类生成了一个外观漂亮的模型映射,我只是不希望某些约定改变我的数据模型。
具体来说,当FK列正确映射为{{1}时,由于进入SQL的虚假列SELECT
,我无法运行简单的Extent1.LinkedEntity_id
查询我没有理由在我的数据库中使用不同的名称。
清晰度:这个代码优先模型是从DB-first反向设计的。数据库规则,我无法改变其设计。
问题:如何一次禁用所有约定?似乎我无法在linkedentity
.Clear
方法
答案 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);
}
随意更多地了解这个概念并报告您的发现。