public static void MapLists <T>(this ClasslikeMapBase <T> dynamicMap, IList <PropertyInfo> listColumns) where T : DynamicClass { var tableName = typeof(T).Name.Split(".".ToCharArray()).Last(); foreach (var column in listColumns) { var method = typeof(FluentNHibernate.Reveal).GetMethods().Where(m => m.Name == "Member").Last(); var genericType = column.PropertyType.GenericTypeArguments.First(); var listType = typeof(IEnumerable <>).MakeGenericType(new[] { genericType }); var generic = method.MakeGenericMethod(typeof(T), listType); dynamic tmp = generic.Invoke(dynamicMap, new object[] { column.Name }); //HasMany<object>(x => x.Id).KeyColumn("").Inverse().AsSet(); // for intellisense dynamicMap.HasMany(tmp).KeyColumn(tableName + "_id").Inverse().AsSet().Not.LazyLoad();//.Cascade.None(); } }
/// <summary> /// Implementation for late binding generic call. Shouldn't be called directly Called through reflection. /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TChild"></typeparam> /// <param name="mapping"></param> /// <param name="property"></param> /// <param name="ownership"></param> private static void MapOneToManyImplementation <T, TChild>(ClasslikeMapBase <T> mapping, PropertyInfo property, Ownership ownership) { var part = mapping.HasMany <TChild>(CreateCollectionExpression <T, TChild>(property)); part.KeyColumn(typeof(T).Name + "ID"); switch (ownership) { case Ownership.Exclusive: part.Cascade.All(); break; case Ownership.None: part.Cascade.None(); break; case Ownership.Shared: default: part.Cascade.AllDeleteOrphan(); break; } //part.ForeignKeyConstraintName("FK_" + typeof(T).Name + "_" + typeof(TChild).Name); }
/// <summary> /// /// </summary> /// <param name="map"></param> /// <param name="hierarchyTableName"></param> /// <typeparam name="T"></typeparam> public static void TreeMap <T>(this ClasslikeMapBase <T> map, string hierarchyTableName) where T : TreeNode <T> { map.References(x => x.Parent) .LazyLoad() .Nullable() .Column("PARENT_ID"); map.HasMany(x => x.Children) .Access.ReadOnlyPropertyThroughCamelCaseField() .Cascade.All() .Inverse() .AsSet() .LazyLoad() .BatchSize(250) .KeyColumn("PARENT_ID"); map.HasManyToMany(x => x.Ancestors) .Access.ReadOnlyPropertyThroughCamelCaseField() .Cascade.None() .AsSet() .LazyLoad() .BatchSize(250) .Table(hierarchyTableName) .ParentKeyColumn("CHILD_ID") .ChildKeyColumn("PARENT_ID") .ForeignKeyConstraintNames(string.Format("FK_{0}_CHILD", hierarchyTableName), null); map.HasManyToMany(x => x.Descendants) .Access.ReadOnlyPropertyThroughCamelCaseField() .Cascade.All() .Inverse() .AsSet() .LazyLoad() .BatchSize(250) .Table(hierarchyTableName) .ParentKeyColumn("PARENT_ID") .ChildKeyColumn("CHILD_ID") .ForeignKeyConstraintNames(string.Format("FK_{0}_PARENT", hierarchyTableName), null); }