private Mapping.Collection CreateMap(HbmMap mapMapping, string prefix, string path,
			PersistentClass owner, System.Type containingType, IDictionary<string, MetaAttribute> inheritedMetas)
		{
			var map = new Map(owner);
			BindCollection(mapMapping, map, prefix, path, containingType, inheritedMetas);
			AddMapSecondPass(mapMapping, map, inheritedMetas);
			return map;
		}
        public void WhenAssignComponentRelationThenUseHbmCompositeMapKeyElement()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            mapper.Component(mkm => { });

            hbmMap.Item.Should().Be.OfType<HbmCompositeMapKey>();
        }
        public void WhenAssignComponentRelationThenAssignClass()
        {
            var keyType = typeof(MyClass);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            mapper.Component(mkm => { });

            var keyElement = (HbmCompositeMapKey)hbmMap.Item;
            keyElement.Class.Should().Not.Be.Null();
            keyElement.Class.Should().Contain("MyClass");
        }
		public virtual void Map(MemberInfo property, Action<IMapPropertiesMapper> collectionMapping,
								Action<IMapKeyRelation> keyMapping, Action<ICollectionElementRelation> mapping)
		{
			var hbm = new HbmMap {name = property.Name};
			System.Type propertyType = property.GetPropertyOrFieldType();
			System.Type dictionaryKeyType = propertyType.DetermineDictionaryKeyType();
			System.Type dictionaryValueType = propertyType.DetermineDictionaryValueType();

			collectionMapping(new MapMapper(container, dictionaryKeyType, dictionaryValueType, hbm, mapDoc));
			keyMapping(new MapKeyRelation(dictionaryKeyType, hbm, mapDoc));
			mapping(new CollectionElementRelation(dictionaryValueType, MapDoc, rel => hbm.Item1 = rel));
			AddProperty(hbm);
		}
        public void WhenAssignComponentRelationThenCallActionWithNotNullParameter()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            var called = false;
            mapper.Component(mkm =>
            {
                called = true;
                mkm.Should().Not.Be.Null();
            });

            called.Should().Be.True();
        }
 public MapKeyRelation(Type dictionaryKeyType, HbmMap mapMapping, HbmMapping mapDoc)
 {
     if (dictionaryKeyType == null)
     {
         throw new ArgumentNullException("dictionaryKeyType");
     }
     if (mapMapping == null)
     {
         throw new ArgumentNullException("mapMapping");
     }
     if (mapDoc == null)
     {
         throw new ArgumentNullException("mapDoc");
     }
     this.dictionaryKeyType = dictionaryKeyType;
     this.mapMapping = mapMapping;
     this.mapDoc = mapDoc;
 }
        public void WhenAssignComponentRelationThenActionShouldReuseSameInstanceOfMapper()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            IComponentMapKeyMapper parameterCall1 = null;
            IComponentMapKeyMapper parameterCall2 = null;
            mapper.Component(mkm =>
            {
                parameterCall1 = mkm;
            });
            mapper.Component(mkm =>
            {
                parameterCall2 = mkm;
            });

            parameterCall1.Should().Be.SameInstanceAs(parameterCall2);
        }
		/// <summary>
		/// Called for Maps
		/// </summary>
		private void BindMapSecondPass(HbmMap mapMapping, Map model,
			IDictionary<string, PersistentClass> persistentClasses, IDictionary<string, MetaAttribute> inheritedMetas)
		{
			BindCollectionSecondPass(mapMapping, model, persistentClasses, inheritedMetas);

			HbmIndex indexMapping;
			HbmMapKey mapKeyMapping;

			HbmIndexManyToMany indexManyToManyMapping;
			HbmMapKeyManyToMany mapKeyManyToManyMapping;

			HbmCompositeIndex compositeIndexMapping;
			HbmCompositeMapKey compositeMapKeyMapping;

			HbmIndexManyToAny indexManyToAnyMapping;

			if ((indexMapping = mapMapping.Item as HbmIndex) != null)
			{
				var value = new SimpleValue(model.CollectionTable);
				new ValuePropertyBinder(value, Mappings).BindSimpleValue(indexMapping, IndexedCollection.DefaultIndexColumnName,
																		 model.IsOneToMany);
				model.Index = value;
				if (string.IsNullOrEmpty(model.Index.TypeName))
					throw new MappingException("map index element must specify a type: " + model.Role);
			}
			else if ((mapKeyMapping = mapMapping.Item as HbmMapKey) != null)
			{
				var value = new SimpleValue(model.CollectionTable);
				new ValuePropertyBinder(value, Mappings).BindSimpleValue(mapKeyMapping, IndexedCollection.DefaultIndexColumnName,
																																 model.IsOneToMany);
				model.Index = value;
				if (string.IsNullOrEmpty(model.Index.TypeName))
					throw new MappingException("map index element must specify a type: " + model.Role);
			}
			else if ((indexManyToManyMapping = mapMapping.Item as HbmIndexManyToMany) != null)
			{
				var manyToOne = new ManyToOne(model.CollectionTable);
				BindIndexManyToMany(indexManyToManyMapping, manyToOne, IndexedCollection.DefaultIndexColumnName, model.IsOneToMany);
				model.Index = manyToOne;
			}
			else if ((mapKeyManyToManyMapping = mapMapping.Item as HbmMapKeyManyToMany) != null)
			{
				var manyToOne = new ManyToOne(model.CollectionTable);
				BindMapKeyManyToMany(mapKeyManyToManyMapping, manyToOne, IndexedCollection.DefaultIndexColumnName, model.IsOneToMany);
				model.Index = manyToOne;
			}
			else if ((compositeIndexMapping = mapMapping.Item as HbmCompositeIndex) != null)
			{
				var component = new Component(model);
				BindComponent(compositeIndexMapping, component, null, null, model.Role + ".index", model.IsOneToMany, inheritedMetas);
				model.Index = component;
			}
			else if ((compositeMapKeyMapping = mapMapping.Item as HbmCompositeMapKey) != null)
			{
				var component = new Component(model);
				BindComponent(compositeMapKeyMapping, component, null, null, model.Role + ".index", model.IsOneToMany, inheritedMetas);
				model.Index = component;
			}
			else if ((indexManyToAnyMapping = mapMapping.Item as HbmIndexManyToAny) != null)
			{
				var any = new Any(model.CollectionTable);
				BindIndexManyToAny(indexManyToAnyMapping, any, model.IsOneToMany);
				model.Index = any;				
			}

			bool indexIsFormula = model.Index.ColumnIterator.Any(x=> x.IsFormula);
			if (NeedBackref(model) && !indexIsFormula)
			{
				string entityName = ((OneToMany)model.Element).ReferencedEntityName;
				PersistentClass referenced = mappings.GetClass(entityName);
				var ib = new IndexBackref();
				ib.Name = '_' + model.OwnerEntityName + "." + mapMapping.Name + "IndexBackref";
				ib.IsUpdateable = false;
				ib.IsSelectable = false;
				ib.CollectionRole = model.Role;
				ib.EntityName = model.Owner.EntityName;
				ib.Value = model.Index;
				referenced.AddProperty(ib);
			}
		}
		private void AddMapSecondPass(HbmMap mapMapping, Map model, IDictionary<string, MetaAttribute> inheritedMetas)
		{
			mappings.AddSecondPass(delegate(IDictionary<string, PersistentClass> persistentClasses)
				{
					PreCollectionSecondPass(model);
					BindMapSecondPass(mapMapping, model, persistentClasses, inheritedMetas);
					PostCollectionSecondPass(model);
				});
		}
Пример #10
0
		/// <summary>
		/// Called for Maps
		/// </summary>
		private void BindMapSecondPass(HbmMap mapMapping, Map model,
			IDictionary<string, PersistentClass> persistentClasses, IDictionary<string, MetaAttribute> inheritedMetas)
		{
			BindCollectionSecondPass(mapMapping, model, persistentClasses, inheritedMetas);

			HbmIndex indexMapping;
			HbmMapKey mapKeyMapping;

			HbmIndexManyToMany indexManyToManyMapping;
			HbmMapKeyManyToMany mapKeyManyToManyMapping;

			HbmCompositeIndex compositeIndexMapping;
			HbmCompositeMapKey compositeMapKeyMapping;

			HbmIndexManyToAny indexManyToAnyMapping;

			if ((indexMapping = mapMapping.Item as HbmIndex) != null)
			{
				var value = new SimpleValue(model.CollectionTable);
				new ValuePropertyBinder(value, Mappings).BindSimpleValue(indexMapping, IndexedCollection.DefaultIndexColumnName,
				                                                         model.IsOneToMany);
				model.Index = value;
				if (string.IsNullOrEmpty(model.Index.TypeName))
					throw new MappingException("map index element must specify a type: " + model.Role);
			}
			else if ((mapKeyMapping = mapMapping.Item as HbmMapKey) != null)
			{
				var value = new SimpleValue(model.CollectionTable);
				new ValuePropertyBinder(value, Mappings).BindSimpleValue(mapKeyMapping, IndexedCollection.DefaultIndexColumnName,
																																 model.IsOneToMany);
				model.Index = value;
				if (string.IsNullOrEmpty(model.Index.TypeName))
					throw new MappingException("map index element must specify a type: " + model.Role);
			}
			else if ((indexManyToManyMapping = mapMapping.Item as HbmIndexManyToMany) != null)
			{
				var manyToOne = new ManyToOne(model.CollectionTable);
				BindIndexManyToMany(indexManyToManyMapping, manyToOne, IndexedCollection.DefaultIndexColumnName, model.IsOneToMany);
				model.Index = manyToOne;
			}
			else if ((mapKeyManyToManyMapping = mapMapping.Item as HbmMapKeyManyToMany) != null)
			{
				var manyToOne = new ManyToOne(model.CollectionTable);
				BindMapKeyManyToMany(mapKeyManyToManyMapping, manyToOne, IndexedCollection.DefaultIndexColumnName, model.IsOneToMany);
				model.Index = manyToOne;
			}
			else if ((compositeIndexMapping = mapMapping.Item as HbmCompositeIndex) != null)
			{
				var component = new Component(model);
				BindComponent(compositeIndexMapping, component, null, null, model.Role + ".index", model.IsOneToMany, inheritedMetas);
				model.Index = component;
			}
			else if ((compositeMapKeyMapping = mapMapping.Item as HbmCompositeMapKey) != null)
			{
				var component = new Component(model);
				BindComponent(compositeMapKeyMapping, component, null, null, model.Role + ".index", model.IsOneToMany, inheritedMetas);
				model.Index = component;
			}
			else if ((indexManyToAnyMapping = mapMapping.Item as HbmIndexManyToAny) != null)
			{
				var any = new Any(model.CollectionTable);
				BindIndexManyToAny(indexManyToAnyMapping, any, model.IsOneToMany);
				model.Index = any;				
			}
		}
        public void WhenAssignElementRelationThenActionShouldReuseSameInstanceOfHbmElement()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            mapper.Element(mkm => mkm.Column("pizza"));
            mapper.Element(mkm => mkm.Length(30));

            var keyElement = (HbmMapKey)hbmMap.Item;
            keyElement.length.Should().Be("30");
            keyElement.column.Should().Be("pizza");
        }
        public void WhenAssignManyToManyRelationThenUseHbmMapKeyManyToManyElement()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            mapper.ManyToMany(mkm => { });

            hbmMap.Item.Should().Be.OfType<HbmMapKeyManyToMany>();
        }
        public void WhenAssignManyToManyRelationActionShouldReuseSameInstanceOfHbmElement()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            mapper.ManyToMany(mkm => mkm.Column("pizza"));
            mapper.ManyToMany(mkm => mkm.ForeignKey("FK"));

            var keyElement = (HbmMapKeyManyToMany)hbmMap.Item;
            keyElement.foreignkey.Should().Be("FK");
            keyElement.column.Should().Be("pizza");
        }
        public void WhenAssignElementRelationThenAssignType()
        {
            var keyType = typeof(string);
            var hbmMap = new HbmMap();
            var hbmMapping = new HbmMapping();
            var mapper = new MapKeyRelation(keyType, hbmMap, hbmMapping);
            mapper.Element(mkm => { });

            var keyElement = (HbmMapKey)hbmMap.Item;
            keyElement.Type.name.Should().Not.Be.Null();
            keyElement.Type.name.Should().Contain("String");
        }