private void MapInheritanceTree(Type classType, ClassMappingBase mapping, IList <string> mappedProperties) { var discriminatorSet = false; var isDiscriminated = expressions.IsDiscriminated(classType); foreach (var inheritedClass in mappingTypes.Where(q => q.Type.BaseType == classType && !expressions.IsConcreteBaseType(q.Type.BaseType))) { if (isDiscriminated && !discriminatorSet && mapping is ClassMapping) { var discriminatorColumn = expressions.DiscriminatorColumn(classType); var discriminator = new DiscriminatorMapping { ContainingEntityType = classType, Type = new TypeReference(typeof(string)) }; discriminator.AddDefaultColumn(new ColumnMapping { Name = discriminatorColumn }); ((ClassMapping)mapping).Discriminator = discriminator; discriminatorSet = true; } ISubclassMapping subclassMapping; var subclassStrategy = expressions.SubclassStrategy(classType); if (subclassStrategy == SubclassStrategy.JoinedSubclass) { // TODO: This id name should be removed. Ideally it needs to be set by a // default and be overridable by a convention (preferably the ForeignKey convention // that already exists) var subclass = new JoinedSubclassMapping { Type = inheritedClass.Type }; subclass.Key = new KeyMapping(); subclass.Key.AddDefaultColumn(new ColumnMapping { Name = mapping.Type.Name + "_id" }); subclassMapping = subclass; } else { subclassMapping = new SubclassMapping(); } MapSubclass(mappedProperties, subclassMapping, inheritedClass); mapping.AddSubclass(subclassMapping); MergeMap(inheritedClass.Type, (ClassMappingBase)subclassMapping, mappedProperties); } }
public override string GetDiscriminatorColumn(Type type) { if (expressions.DiscriminatorColumn != null) { return(expressions.DiscriminatorColumn(type)); } return(base.GetDiscriminatorColumn(type)); }