FluentNHibernate: Get Column and Table Names After Applying Mapping Conventions

I am wondering if it is possible to find the run-time column name for the class / component that was mapped to FluentNHibernate after applying all conventions.

For example, given a simple model:

public class Address{ public string Street {get; set;} public string Zip {get; set;} } public class AddressMap : ComponentMap<Address>{ Map( x => x.Street ); Map( x => x.Zip ); } public class PersonMap : ClassMap<Person> { public PersonMap(){ Id( x => x.Id ); Map( x=> x.Ssn ); Map( x=> x.Name ); Component( x => x.Address ) .ColumnPrefix("ADDRESS_"); } } public class ClassConvention : IClassConvention { public void Apply( IClassInstance instance ) { instance.Table( "tbl" + instance.EntityType.Name ); } } 

Table Name: tblPerson

  Id Name Ssn ADDRESS_Street ADDRESS_Zip ----------------------------------------------------------- 1 Brian 11223344 123 Example St. 12345 

What I'm looking for and what I don’t know how to do it:

 var mappings = FluentNHibaernate.CompileMergeAndBuildAllMappings(); var zipCodeColumnName = mappings.FindMappedType<Address>().ColumnName(a => a.Zip) zipCodeColumnName.ShouldBe("ADDRESS_Zip"); // Here I'm interested in the run-time & final column name with the // prefix applied from the PersonMap class. var personTableName = mappings.FindMappedType<Person>().TableName; personTableName.ShouldBe("tblPerson"); // I'm interested in the final table name after the ClassConvention // modified the table name. 

Additional clarification

  • I'm only interested in the result of applying FluentNHiberante conventions and comparisons. Not in the real SQL generated by NHibernate.

Thanks for the help,
Brian

+4
source share
2 answers

since the column names of the component may be different for each component application, you need to know what property you want.

 var config = Fluently.Configure() .DataBase(...) .Mappings(...) .BuildConfiguration(); var map = config.GetClassMapping(typeof(Person)); map.Table.Name.ShouldBe("tblPerson"); map.GetProperty("Address").IsComposite.ShouldBe(true); ((Component)map.GetProperty("Address").Value) .GetProperty("Zip").ColumnIterator.First() .Text.ShouldBe("ADDRESS_Zip"); 
+2
source
  [Test] public void test4() { var ssnColumn = RuntimeNames .ColumnName<Person>( x => x.Ssn ); ssnColumn.ShouldEqual( "Ssn" ); var addressColumn = RuntimeNames .ColumnName<Person>( x => x.Address.Street ); addressColumn.ShouldEqual( "ADDRESS_Street" ); var personTableName = RuntimeNames .TableName<Person>(); personTableName.ShouldEqual( "tblPerson" ); } 

 public static class RuntimeNames { private static Configuration cfg = Fluently.Configure() .Database( MsSqlConfiguration.MsSql2005 ) .Mappings( m => m.FluentMappings .AddFromAssemblyOf<PersonMap>() .Conventions .AddFromAssemblyOf<PersonMap>() ).BuildConfiguration(); public static string ColumnName<T>( Expression<Func<T, object>> property ) where T : class, new() { var accessor = FluentNHibernate.Utils.Reflection .ReflectionHelper.GetAccessor( property ); var names = accessor.Name.Split('.'); var classMapping = cfg.GetClassMapping( typeof( T ) ); return WalkPropertyChain( classMapping.GetProperty(names.First()), 0, names ); } private static string WalkPropertyChain(Property property, int index, string[] names) { if( property.IsComposite ) return WalkPropertyChain( ((Component)property.Value).GetProperty( names[++index] ), index, names ); return property.ColumnIterator.First().Text; } public static string TableName<T>() where T : class, new() { return cfg.GetClassMapping( typeof(T) ) .Table.Name; } } 
+3
source

Source: https://habr.com/ru/post/1398544/


All Articles