From 7674a4d2d2aff46779152c594cad4ebee86a7043 Mon Sep 17 00:00:00 2001 From: James Gregory Date: Sat, 22 May 2010 22:13:03 -0600 Subject: [PATCH] Added fix for duplicate columns in keys --- .../Automapping/OverrideSpecs.cs | 3 + .../FluentInterface/ProviderSpec.cs | 5 +- .../PersistenceModel/SubclassSpecs.cs | 82 ++++++++++++++++++- .../FluentInterfaceTests/BaseModelFixture.cs | 4 +- src/FluentNHibernate/FluentNHibernate.csproj | 2 +- .../IIndeterminateSubclassMappingProvider.cs | 2 +- src/FluentNHibernate/Mapping/SubclassMap.cs | 10 ++- .../MappingModel/ClassBased/ComponentType.cs | 17 ++++ .../MappingModel/ClassBased/SubclassType.cs | 17 +++- .../MappingModel/ColumnMapping.cs | 4 - .../MappingModel/DefaultableList.cs | 4 +- .../MappingModel/KeyMapping.cs | 8 +- .../Visitors/SeparateSubclassVisitor.cs | 12 +-- 13 files changed, 139 insertions(+), 31 deletions(-) diff --git a/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs b/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs index ad332145f..bd966424b 100644 --- a/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs +++ b/src/FluentNHibernate.Specs/Automapping/OverrideSpecs.cs @@ -43,7 +43,10 @@ public class when_using_an_automapping_override_to_specify_a_discriminator mapping.Discriminator.ShouldNotBeNull(); It should_map_subclasses_as_subclass_instead_of_joined_subclass = () => + { + mapping.Subclasses.Count().ShouldEqual(1); mapping.Subclasses.ShouldEachConformTo(x => x.SubclassType == SubclassType.Subclass); + }; static AutoPersistenceModel model; static ClassMapping mapping; diff --git a/src/FluentNHibernate.Specs/FluentInterface/ProviderSpec.cs b/src/FluentNHibernate.Specs/FluentInterface/ProviderSpec.cs index a6c7b4d3a..ff93bfb93 100644 --- a/src/FluentNHibernate.Specs/FluentInterface/ProviderSpec.cs +++ b/src/FluentNHibernate.Specs/FluentInterface/ProviderSpec.cs @@ -19,13 +19,10 @@ public static ClassMapping map_as_class(Action> setup) public static SubclassMapping map_as_subclass(Action> setup) { var provider = new SubclassMap(); - var mapping = new SubclassMapping(SubclassType.Subclass); setup(provider); - ((IIndeterminateSubclassMappingProvider)provider).GetSubclassMapping(mapping); - - return mapping; + return ((IIndeterminateSubclassMappingProvider)provider).GetSubclassMapping(SubclassType.Subclass); } } } \ No newline at end of file diff --git a/src/FluentNHibernate.Specs/PersistenceModel/SubclassSpecs.cs b/src/FluentNHibernate.Specs/PersistenceModel/SubclassSpecs.cs index 7542d22aa..2116d5332 100644 --- a/src/FluentNHibernate.Specs/PersistenceModel/SubclassSpecs.cs +++ b/src/FluentNHibernate.Specs/PersistenceModel/SubclassSpecs.cs @@ -1,7 +1,13 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; +using FluentNHibernate.Cfg.Db; +using FluentNHibernate.Mapping; +using FluentNHibernate.MappingModel; using FluentNHibernate.MappingModel.ClassBased; using FluentNHibernate.Specs.PersistenceModel.Fixtures; using Machine.Specifications; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; namespace FluentNHibernate.Specs.PersistenceModel { @@ -23,4 +29,78 @@ public class when_subclass_map_is_combined_with_a_class_map_flagged_as_union static FluentNHibernate.PersistenceModel model; static ClassMapping mapping; } + + public class when_subclass_map_has_a_has_many_to_another_entity + { + Establish context = () => + { + model = new FluentNHibernate.PersistenceModel(); + model.Add(new ProductMap()); + model.Add(new SpecialProductMap()); + model.Add(new OptionMap()); + + cfg = new Configuration(); + SQLiteConfiguration.Standard.InMemory() + .ConfigureProperties(cfg); + model.Configure(cfg); + + new SchemaExport(cfg).Create(true, false); + }; + + Because of = () => + mappings = model.BuildMappings() + .SelectMany(x => x.Classes); + + It should_only_use_one_column_in_the_target_entity_s_key = () => + mappings.Single(x => x.Type == typeof(Product)) + .Subclasses.Single() + .Collections.Single() + .Key.Columns.Select(x => x.Name) + .ShouldContainOnly("SpecialProduct_id"); + + static FluentNHibernate.PersistenceModel model; + static IEnumerable mappings; + static Configuration cfg; + + class Product + { + public int ProductId { get; set; } + } + + class SpecialProduct : Product + { + public ICollection