如何更改所有实体的自动生成的“阴影属性”外键名称?

时间:2019-02-09 11:28:06

标签: entity-framework

我有这样的模型

public class Class1 {
    public int identifier {get;set;}
}
public class Class2 {
    public int identifier {get;set;}
    public List<Class1> holders {get;set;}
    public List<Class1> users{get;set;}
}

我的问题是在Class1名称中生成的外键是“ Class2_identifier”和“ Class2_identifier1”,而我想要的是“ Class2_holders_identifier”和“ Class2_users_identifier”

真正的模型非常庞大,因此我要寻找的是替代“添加迁移”步骤中名称的生成方式

1 个答案:

答案 0 :(得分:2)

这不是一个完整的实现,只是一个提示:如果您使用EntityFramework 6,则可以定义自定义模型约定:

public class ForeignKeyNamingConvention : IStoreModelConvention<AssociationType>
{
    public void Apply(AssociationType association, DbModel model)
    {
        if (association.IsForeignKey)
        {
            var constraint = association.Constraint;
            // Implement your renaming code.
            // The data you need is inside association.Constraint.
        }
    }
}

并将其添加到您的DbContext.OnModelCreating

modelBuilder.Conventions.Add(new ForeignKeyNamingConvention());

This answer包含一些可重复使用的代码(在这种情况下,约定用于删除列名中的下划线)。

编辑: OP在此处提供了最终解决方案:

ef核心中提到的问题“与ef6中的问题相同,但没有消息”控制台

  

“ Class1”和“ Class2”之间存在多种关系,而没有配置外键属性,导致EF在“组织”上创建阴影属性,其名称取决于发现顺序。

public class ForeignKeyNamingConvention : IStoreModelConvention<AssociationType>
{
    public void Apply(AssociationType association, DbModel model)
    {
        if (association.IsForeignKey)
        {
            var constraint = association.Constraint;
            // as i just needed the fk column name to be more clear 
            // "{entityName}_{propertyName}" which is provided in 
            // {association.Name}
            association.Constraint.ToProperties[0].Name = association.Name;
        }
    }
}