Мы успешно использовали следующий подход (с FluentNH 1.2.0.712 ):
public class SomeClass
{
public int Id { get; set; }
public IDictionary Properties { get; set; }
}
public class SomeClassMapping : ClassMap<SomeClass>
{
public SomeClassMapping()
{
Id(x => x.Id);
// Maps the MyEnum members to separate int columns.
DynamicComponent(x => x.Properties,
c =>
{
foreach (var name in Enum.GetNames(typeof(MyEnum)))
c.Map<int>(name);
});
}
}
Здесь мы сопоставили все элементы некоторого Enum в отдельные столбцы, где все они имеют тип int . Сейчас я работаю над сценарием, в котором мы используем разные типы динамических столбцов, который выглядит следующим образом:
// ExtendedProperties contains custom objects with Name and Type members
foreach (var property in ExtendedProperties)
{
var prop = property;
part.Map(prop.Name).CustomType(prop.Type);
}
Это тоже очень хорошо работает.
Я все еще собираюсь выяснить, как использовать References
вместо Map
для ссылки на другие типы, которые имеют свое собственное отображение ...
UPDATE:
К сожалению, дело со ссылками сложнее, обратитесь к этой ветке групп Google . Короче говоря:
// This won't work
foreach (var property in ExtendedProperties)
{
var prop = property;
part.Reference(dict => dict[part.Name]);
}
// This works but is not very dynamic
foreach (var property in ExtendedProperties)
{
var prop = property;
part.Reference<PropertyType>(dict => dict["MyProperty"]);
}
Пока это все.