外键命名约定和主键命名约定相互影响 - EF

时间:2015-02-16 17:58:59

标签: c# entity-framework entity-framework-6

我正在使用它:

public class ForeignKeyNamingConvention : IStoreModelConvention<AssociationType>
{
    public void Apply(AssociationType association, DbModel model)
    {
        // Identify ForeignKey properties (including IAs)  
        if (association.IsForeignKey)
        {
        // rename FK columns  
        var constraint = association.Constraint;
        if (DoPropertiesHaveDefaultNames(constraint.FromProperties, constraint.ToRole.Name, constraint.ToProperties))
        {
            NormalizeForeignKeyProperties(constraint.FromProperties);
        }
        if (DoPropertiesHaveDefaultNames(constraint.ToProperties, constraint.FromRole.Name, constraint.FromProperties))
        {
            NormalizeForeignKeyProperties(constraint.ToProperties);
        }
        }
    }

    private static bool DoPropertiesHaveDefaultNames(ReadOnlyMetadataCollection<EdmProperty> properties, string roleName, ReadOnlyMetadataCollection<EdmProperty> otherEndProperties)
    {
        if (properties.Count != otherEndProperties.Count)
        {
        return false;
        }

        for (int i = 0; i < properties.Count; ++i)
        {
        if (!properties[i].Name.EndsWith("_" + otherEndProperties[i].Name))
        {
            return false;
        }
        }
        return true;
    }

    private void NormalizeForeignKeyProperties(ReadOnlyMetadataCollection<EdmProperty> properties)
    {
        for (int i = 0; i < properties.Count; ++i)
        {
        int underscoreIndex = properties[i].Name.IndexOf('_');
        if (underscoreIndex > 0)
        {
            properties[i].Name = properties[i].Name.Remove(underscoreIndex, 1);
        }
        }
    }
}

删除&#39; _&#39;在外键名称中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Conventions.Add<ForeignKeyNamingConvention>();
}

这很好用。但是,我还想将实体名称与Id连接起来,所以我使用:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Conventions.Add<ForeignKeyNamingConvention>();

    modelBuilder.Properties()
    .Where(p => p.Name == "Id")
    .Configure(p => p.IsKey().HasColumnName(p.ClrPropertyInfo.ReflectedType.Name + "Id"));
}

不幸的是,我一使用:

modelBuilder.Properties()
        .Where(p => p.Name == "Id")
        .Configure(p => p.IsKey().HasColumnName(p.ClrPropertyInfo.ReflectedType.Name + "Id"));

外键名称包含&#39; _&#39;再次。为什么这样,我怎么能克服这个?

0 个答案:

没有答案