我有一个数据库架构,其中外键名称的约定为:
ForeignTable.Name + ForeignTable.PrimaryKeyName
因此,对于引用带有主键列
Child
的Parent
表的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/