fluent-nhibernate - 我可以制定包括父键名称的Fluent NHibernate外键约定吗?

标签 fluent-nhibernate naming-conventions

我有一个数据库架构,其中外键名称的约定为:

ForeignTable.Name + ForeignTable.PrimaryKeyName

因此,对于引用带有主键列ChildParent表的Key表,外键将类似于ParentKey

是否可以在Fluent NHibernate映射中创建此约定?

目前,我正在使用ForeignKeyConvention实现,如下所示:
public class ForeignKeyNamingConvention : ForeignKeyConvention
{
    protected override string GetKeyName(PropertyInfo property, Type type)
    {
        if (property == null)
        {
            // Relationship is many-to-many, one-to-many or join.
            if (type == null)
                throw new ArgumentNullException("type");

            return type.Name + "ID";
        }

        // Relationship is many-to-one.
        return property.Name + "ID";
    }
}

对于所有以“ID”为主键的类型,这都完全符合我的要求。我想做的是用所引用类型的主键名称替换常量“ID”。

如果Fluent NHibernate当前无法做到这一点,我很乐意接受该回答。

最佳答案

如果可以获取类的Mapping<T>,则可以获取其Id列的名称。

public class MyForeignKeyConvention: ForeignKeyConvention
{
    public static IList<IMappingProvider> Mappings = new List<IMappingProvider>();

    protected override string GetKeyName( System.Reflection.PropertyInfo property, Type type )
    {
        var pk = "Id";

        var model = new PersistenceModel();
        foreach( var map in Mappings ) {
            model.Add( map );
        }

        try {
            var mymodel = (IdMapping) model.BuildMappings()
                .First( x => x.Classes.FirstOrDefault( c => c.Type == type ) != null )
                .Classes.First().Id;

            Func<IdMapping, string> getname = x => x.Columns.First().Name;
            pk = getname( mymodel );
        } catch {
        }

        if (property == null) {
            return type.Name + pk;
        }
        return type.Name + property.Name;
    }
}

我们可以使用一些管道来获得Mapping对象。
ClassMap<T>的构造函数可以将this传递到我们的Mappers集合中。

对于AutoMapping<T>,我们可以如下使用Override。
.Mappings( m => m.AutoMappings.Add( AutoMap.AssemblyOf<FOO>()
    .Override<User>( u => {
        u.Id( x => x.Id ).Column( "UID" );
        MyForeignKeyConvention.Mappings.Add( u );
    }
)

关于fluent-nhibernate - 我可以制定包括父键名称的Fluent NHibernate外键约定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2292051/

相关文章:

c# - 流利的 : Table name different from entity name

nhibernate - nHibernate 中的 'Bag' 和 'Set' 是什么?

c# - 从 Fluent NHibernate 中的种子表生成身份

c# - 用于命名旨在替换现有 API 的 C# 类/方法的建议

java - 当两个类同名时的类命名约定

.net - 用于映射 IDictionary<SomeEntity, int> 的流畅代码?

nhibernate - 如何使用 Fluent NHibernate 映射实体 -> 接口(interface)关系?

go - 复合词的文件名约定?

go - 生成的 go 文件的名称

scala - 做以_结尾的方法!在Scala中有特殊含义吗?