コード例 #1
0
        public void WhenFindAncestorOfNullThenReturnEmpty()
        {
            var domainAnalyzer = new ObjectRelationalMapper();

            domainAnalyzer.AddToDomain(typeof(MyRelation));
            domainAnalyzer.AddToDomain(typeof(MyRelation1));
            domainAnalyzer.GetBaseImplementors(null).Should().Be.Empty();
        }
コード例 #2
0
        public void WhenAskForInterfaceThenGetFistEntityImplementingTheInterface()
        {
            var domainAnalyzer = new ObjectRelationalMapper();

            domainAnalyzer.AddToDomain(typeof(MyRelation));
            domainAnalyzer.AddToDomain(typeof(MyRelation1));
            domainAnalyzer.GetBaseImplementors(typeof(IRelation)).Single().Should().Be(typeof(MyRelation));
            domainAnalyzer.GetBaseImplementors(typeof(Relation1)).Single().Should().Be(typeof(MyRelation1));
        }
コード例 #3
0
        public void WhenEntitiesOfDomainThenOnlyReturnFirstImplementorInTheHierarchy()
        {
            var domainAnalyzer = new ObjectRelationalMapper();

            domainAnalyzer.AddToDomain(typeof(MyRelation));
            domainAnalyzer.AddToDomain(typeof(MyRelation1));
            domainAnalyzer.AddToDomain(typeof(MyRelationLevel1));
            domainAnalyzer.AddToDomain(typeof(MyRelation1Lvel1));
            domainAnalyzer.GetBaseImplementors(typeof(IRelation)).Single().Should().Be(typeof(MyRelation));
            domainAnalyzer.GetBaseImplementors(typeof(Relation1)).Single().Should().Be(typeof(MyRelation1));
        }
コード例 #4
0
        public void WhenModifyStateThenFindNewResults()
        {
            var domainAnalyzer = new ObjectRelationalMapper();

            domainAnalyzer.AddToDomain(typeof(MyRelation));

            domainAnalyzer.GetBaseImplementors(typeof(Relation1)).Should().Be.Empty();

            domainAnalyzer.AddToDomain(typeof(MyRelation1));
            domainAnalyzer.GetBaseImplementors(typeof(Relation1)).Single().Should().Be(typeof(MyRelation1));
        }
コード例 #5
0
        public void WhenTheDomainContainsMoreImplsThenMatch()
        {
            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <MyEntity>();
            orm.TablePerClass <MyRoot1>();
            orm.TablePerClass <MyRoot2>();

            orm.AddToDomain(typeof(MyRelatedNoRoot1));
            orm.AddToDomain(typeof(MyRelatedNoRoot2));

            var pattern = new PolymorphismBidirectionalAnyToManyPattern(orm);

            pattern.Match(ForClass <MyRelatedNoRoot1> .Property(x => x.Items)).Should().Be.True();
            pattern.Match(ForClass <MyRelatedNoRoot2> .Property(x => x.Items)).Should().Be.True();
        }
コード例 #6
0
        public void WhenRelationIsWithNoRootEntitiesThenMatch()
        {
            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <MyEntity>();
            orm.TablePerClass <MyRoot1>();
            orm.TablePerClass <MyRoot2>();

            // in this test I'm adding the two classes through the ObjectRelationalMapper but in a normal usage
            // this work will be done by the mapper when I ask for the mapping of MyRelatedNoRoot1 and MyRelatedNoRoot2
            orm.AddToDomain(typeof(MyRelatedNoRoot1));
            orm.AddToDomain(typeof(MyRelatedNoRoot2));

            var pattern = new HeterogeneousAssociationOnPolymorphicPattern(orm);

            pattern.Match(ForClass <MyEntity> .Property(x => x.Related)).Should().Be.True();
        }
コード例 #7
0
        public void GetBaseImplementorsShouldReturnOnlyTheFirstBaseClassOfTheHierarchy()
        {
            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <Animal>();
            orm.ManyToMany <Human, Human>();
            orm.AddToDomain(new[] { typeof(Animal), typeof(Reptile), typeof(Lizard), typeof(Mammal), typeof(Human), typeof(DomesticAnimal), typeof(Cat), typeof(Dog) });
            orm.GetBaseImplementors(typeof(Animal)).Should().Have.SameValuesAs(new[] { typeof(Animal) });
        }
コード例 #8
0
        public void WhenInterfaceIsImplementedByNestedComponentThenRecognizeComponentWithTheCorrectClass()
        {
            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <MyEntity>();

            orm.AddToDomain(typeof(UpComponent));
            orm.AddToDomain(typeof(NestedComponent));

            var mapper  = new Mapper(orm);
            var mapping = mapper.CompileMappingFor(new[] { typeof(MyEntity) });

            HbmClass rc = mapping.RootClasses.First(r => r.Name.Contains("MyEntity"));
            var      hbmBagOfIRelation = (HbmBag)rc.Properties.Where(p => p.Name == "NestedComponents").Single();

            var upComponent = (HbmCompositeElement)hbmBagOfIRelation.ElementRelationship;

            upComponent.Properties.Where(p => p.Name == "NestedComponent").Single().Should().Be.OfType <HbmNestedCompositeElement>()
            .And.ValueOf.Class.Should().Contain("NestedComponent");
        }
コード例 #9
0
        public void WhenCircularRelationThenIsManyToOneAndNotHeterogeneous()
        {
            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <Animal>();
            orm.ManyToMany <Human, Human>();
            orm.AddToDomain(new[] { typeof(Animal), typeof(Reptile), typeof(Lizard), typeof(Mammal), typeof(Human), typeof(DomesticAnimal), typeof(Cat), typeof(Dog) });
            orm.IsManyToOne(typeof(Animal), typeof(Animal)).Should().Be.True();
            orm.IsHeterogeneousAssociation(ForClass <Animal> .Property(x => x.Mother)).Should().Be.False();
            orm.IsHeterogeneousAssociation(ForClass <Animal> .Property(x => x.Father)).Should().Be.False();
        }
コード例 #10
0
        public void WhenComplexInheritanceSho()
        {
            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <Animal>();
            orm.ManyToMany <Human, Human>();
            orm.AddToDomain(new[] { typeof(Animal), typeof(Reptile), typeof(Lizard), typeof(Mammal), typeof(Human), typeof(DomesticAnimal), typeof(Cat), typeof(Dog) });
            var mapper  = new Mapper(orm);
            var mapping = mapper.CompileMappingFor(new[] { typeof(Animal) });

            HbmClass rc = mapping.RootClasses.First(r => r.Name.Contains("Animal"));

            rc.Properties.Where(p => p.Name == "Mother").Single().Should().Be.OfType <HbmManyToOne>()
            .And.ValueOf.Class.Should().Be.Null();
            rc.Properties.Where(p => p.Name == "Father").Single().Should().Be.OfType <HbmManyToOne>()
            .And.ValueOf.Class.Should().Be.Null();
        }
コード例 #11
0
        private Mapper GetMapper()
        {
            #region Initialize ConfORM
            //var inflector = new EnglishInflector();

            var orm = new ObjectRelationalMapper();
            IPatternsAppliersHolder patternsAppliers =
                (new SafePropertyAccessorPack())
                .Merge(new SafePoidPack())
                .Merge(new OneToOneRelationPack(orm))
                .Merge(new BidirectionalManyToManyRelationPack(orm))
                .Merge(new BidirectionalOneToManyRelationPack(orm))
                .Merge(new DiscriminatorValueAsClassNamePack(orm))
                .Merge(new CoolTablesNamingPack(orm))
                //.Merge(new PluralizedTablesPack(orm, inflector))
                .Merge(new CoolColumnsNamingPack(orm))
                //.UnionWith(new ConfOrm.Shop.InflectorNaming.CollectionOfElementsColumnApplier(orm, inflector))
                .Merge(new PolymorphismPack(orm))
                .Merge(new TablePerClassPack())
                .Merge(new UseNoLazyForNoProxablePack())                         // <== Lazy false when the class is not proxable
                .Merge(new ConfOrm.Shop.CoolNaming.UnidirectionalOneToManyMultipleCollectionsKeyColumnApplier(orm))
                .Merge(new UseCurrencyForDecimalApplier())
                .Merge(new DatePropertyByNameApplier())
                .Merge(new MsSQL2008DateTimeApplier());

            orm.Patterns.PoidStrategies.Add(new HighLowPoidPattern(new { max_lo = 100 }));

            var mapper = new Mapper(orm, patternsAppliers);

            IEnumerable <Type> tablePerClassEntities = typeof(Entity)
                                                       .Assembly.GetTypes().Where(t => IsRootEntity(t) &&
                                                                                  !tablePerClassHierarchy.Contains(t) &&
                                                                                  !tablePerConcreteClass.Contains(t)).ToList();

            // Mappings
            orm.AddToDomain(typeof(Entity).Assembly.GetTypes());
            orm.TablePerClass(tablePerClassEntities);
            orm.TablePerClassHierarchy(tablePerClassHierarchy);
            orm.TablePerConcreteClass(tablePerConcreteClass);

            #endregion

            ConfOrmMapping(orm, mapper);
            return(mapper);
        }
コード例 #12
0
        public void WhenInterfaceIsImplementedByComponentThenRecognizeComponentWithTheCorrectClass()
        {
            // Note: the MyComponent class must be explicitly declared in ORM or mapper.CompileMappingFor

            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <MyEntity>();

            orm.AddToDomain(typeof(MyComponent));

            var mapper  = new Mapper(orm);
            var mapping = mapper.CompileMappingFor(new[] { typeof(MyEntity) });

            HbmClass rc = mapping.RootClasses.First(r => r.Name.Contains("MyEntity"));

            rc.Properties.Where(p => p.Name == "TheComponent").Single().Should().Be.OfType <HbmComponent>()
            .And.ValueOf.Class.Should().Contain("MyComponent");
        }
コード例 #13
0
        public void WhenInterfaceIsImplementedByEntityAndDomainClassIsAddedToOrmThenRecognizeManyToOneWithTheCorrectClass()
        {
            // Note : in this case the mapping for MyRelationL1 is not required and it is never used explicitly.
            // I have to "present" the class to the DomainInspector as part of my domain

            var orm = new ObjectRelationalMapper();

            orm.TablePerClass <MyEntity>();
            orm.TablePerClass <MyRelationL0>();

            orm.AddToDomain(typeof(MyRelationL1));

            var mapper  = new Mapper(orm);
            var mapping = mapper.CompileMappingFor(new[] { typeof(MyEntity) });

            HbmClass rc = mapping.RootClasses.First(r => r.Name.Contains("MyEntity"));
            var      hbmBagOfIRelation = (HbmBag)rc.Properties.Where(p => p.Name == "Relations").Single();

            hbmBagOfIRelation.ElementRelationship.Should().Be.OfType <HbmOneToMany>()
            .And.ValueOf.Class.Should().Contain("MyRelationL1");
        }
コード例 #14
0
        public void WhenChangeStateOfWholeDomainThenOnlyInvalidateCache()
        {
            var domainAnalyzer = new ObjectRelationalMapper();

            domainAnalyzer.AddToDomain(typeof(MyRelation));
            domainAnalyzer.AddToDomain(typeof(MyRelation1));
            domainAnalyzer.AddToDomain(typeof(MyRelationLevel1));
            domainAnalyzer.AddToDomain(typeof(MyRelation1Lvel1));
            domainAnalyzer.AddToDomain(typeof(IRelation));
            domainAnalyzer.AddToDomain(typeof(Relation1));
            domainAnalyzer.GetBaseImplementors(typeof(Relation1));

            domainAnalyzer.Exclude(typeof(Relation1));

            domainAnalyzer.GetBaseImplementors(typeof(Relation1)).Single().Should().Be(typeof(MyRelation1));
        }
コード例 #15
0
        public void WhenRegisterWholeDomainThenOnlyReturnFirstNoJumpedImplementorInTheHierarchy()
        {
            var domainAnalyzer = new ObjectRelationalMapper();

            domainAnalyzer.AddToDomain(typeof(MyRelation));
            domainAnalyzer.AddToDomain(typeof(MyRelation1));
            domainAnalyzer.AddToDomain(typeof(MyRelationLevel1));
            domainAnalyzer.AddToDomain(typeof(MyRelation1Lvel1));
            domainAnalyzer.AddToDomain(typeof(IRelation));
            domainAnalyzer.AddToDomain(typeof(Relation1));

            domainAnalyzer.Exclude(typeof(Relation1));

            domainAnalyzer.GetBaseImplementors(typeof(IRelation)).Single().Should().Be(typeof(MyRelation));
            domainAnalyzer.GetBaseImplementors(typeof(Relation1)).Single().Should().Be(typeof(MyRelation1));
        }