diff --git a/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs b/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs index 5709782c0..cf93e87c7 100644 --- a/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs +++ b/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs @@ -34,6 +34,30 @@ public class when_using_an_automapping_override_to_create_a_join static ClassMapping mapping; } + public class when_using_an_automapping_override_to_specify_a_discriminators_and_join_on_subclass + { + private Establish context = () => + model = AutoMap.Source(new StubTypeSource(typeof (Parent), typeof (Child))) + .Override(map => + map.DiscriminateSubClassesOnColumn("type")) + .Override(map => map.Join("table", part => { })); + + private Because of = () => + mapping = model.BuildMappingFor(); + + It should_not_create_the_join_mapping = () => + mapping.Joins.Should().BeEmpty(); + + It should_map_the_discriminator = () => + mapping.Discriminator.Should().NotBeNull(); + + It should_map_subclasses_as_joined_subclasses = () => + mapping.Subclasses.Should().OnlyContain(x => x.Joins.Any()); + + static AutoPersistenceModel model; + static ClassMapping mapping; + } + public class when_using_an_automapping_override_to_specify_a_discriminator { Establish context = () => diff --git a/src/FluentNHibernate/Automapping/AutoMapping.cs b/src/FluentNHibernate/Automapping/AutoMapping.cs index 43fb707dc..9e20d02e8 100644 --- a/src/FluentNHibernate/Automapping/AutoMapping.cs +++ b/src/FluentNHibernate/Automapping/AutoMapping.cs @@ -61,12 +61,12 @@ void IAutoClasslike.AlterModel(ClassMappingBase mapping) if (Cache.IsDirty) classMapping.Set(x => x.Cache, Layer.Defaults, ((ICacheMappingProvider)Cache).GetCacheMapping()); - foreach (var join in providers.Joins) - classMapping.AddJoin(join.GetJoinMapping()); - classMapping.Set(x => x.Tuplizer, Layer.Defaults, providers.TuplizerMapping); } + foreach (var join in providers.Joins) + mapping.AddOrReplaceJoin(join.GetJoinMapping()); + foreach (var property in providers.Properties) mapping.AddOrReplaceProperty(property.GetPropertyMapping()); diff --git a/src/FluentNHibernate/MappingModel/ClassBased/ClassMappingBase.cs b/src/FluentNHibernate/MappingModel/ClassBased/ClassMappingBase.cs index fa8c8be40..cf1934404 100644 --- a/src/FluentNHibernate/MappingModel/ClassBased/ClassMappingBase.cs +++ b/src/FluentNHibernate/MappingModel/ClassBased/ClassMappingBase.cs @@ -146,6 +146,11 @@ public void AddJoin(JoinMapping mapping) mappedMembers.AddJoin(mapping); } + public void AddOrReplaceJoin(JoinMapping mapping) + { + mappedMembers.AddOrReplaceJoin(mapping); + } + public void AddFilter(FilterMapping mapping) { mappedMembers.AddFilter(mapping); diff --git a/src/FluentNHibernate/MappingModel/MappedMembers.cs b/src/FluentNHibernate/MappingModel/MappedMembers.cs index 97ead01ca..a386e8154 100644 --- a/src/FluentNHibernate/MappingModel/MappedMembers.cs +++ b/src/FluentNHibernate/MappingModel/MappedMembers.cs @@ -132,6 +132,11 @@ public void AddJoin(JoinMapping mapping) AddMapping(mapping, MappingType.Join); } + public void AddOrReplaceJoin(JoinMapping mapping) + { + AddOrReplaceMapping(mapping, MappingType.Join, x => x.TableName == mapping.TableName); + } + public void AddFilter(FilterMapping mapping) { if (Filters.Any(x => x.Name == mapping.Name))