示例#1
0
        private void BindKey(HbmKey keyMapping, Mapping.Collection model)
        {
            if (keyMapping == null)
            {
                return;
            }
            string    propRef = model.ReferencedPropertyName;
            IKeyValue keyValue;

            if (propRef == null)
            {
                keyValue = model.Owner.Identifier;
            }
            else
            {
                keyValue = (IKeyValue)model.Owner.GetProperty(propRef).Value;
            }
            var key = new DependantValue(model.CollectionTable, keyValue)
            {
                IsCascadeDeleteEnabled = keyMapping.ondelete == HbmOndelete.Cascade
            };

            new ValuePropertyBinder(key, Mappings).BindSimpleValue(keyMapping, Mapping.Collection.DefaultKeyColumnName, model.IsOneToMany);

            if (key.Type.ReturnedClass.IsArray)
            {
                throw new MappingException("illegal use of an array as an identifier (arrays don't reimplement Equals)");
            }
            model.Key = key;

            key.SetNullable(keyMapping.IsNullable.HasValue ? keyMapping.IsNullable.Value : true);
            key.SetUpdateable(keyMapping.IsUpdatable.HasValue ? keyMapping.IsUpdatable.Value : true);
            BindForeignKey(keyMapping.foreignkey, key);
        }
示例#2
0
        /// <remarks>
        /// Called for all collections
        /// </remarks>
        private void BindCollectionSecondPass(XmlNode node, Mapping.Collection model,
                                              IDictionary <string, PersistentClass> persistentClasses, IDictionary <string, MetaAttribute> inheritedMetas)
        {
            if (model.IsOneToMany)
            {
                OneToMany       oneToMany            = (OneToMany)model.Element;
                string          associatedEntityName = oneToMany.ReferencedEntityName;
                PersistentClass persistentClass;
                if (persistentClasses.TryGetValue(associatedEntityName, out persistentClass) == false)
                {
                    throw new MappingException("Association references unmapped class: " + associatedEntityName);
                }
                oneToMany.AssociatedClass = persistentClass;
                model.CollectionTable     = persistentClass.Table;

                if (log.IsInfoEnabled)
                {
                    log.Info("mapping collection: " + model.Role + " -> " + model.CollectionTable.Name);
                }
            }

            //CHECK
            XmlAttribute chNode = node.Attributes["check"];

            if (chNode != null)
            {
                model.CollectionTable.AddCheckConstraint(chNode.Value);
            }

            //contained elements:
            foreach (XmlNode subnode in node.ChildNodes)
            {
                //I am only concerned with elements that are from the nhibernate namespace
                if (subnode.NamespaceURI != Configuration.MappingSchemaXMLNS)
                {
                    continue;
                }

                string name = subnode.LocalName;                 //.Name;

                if ("key".Equals(name) || "generated-key".Equals(name))
                {
                    string    propRef = model.ReferencedPropertyName;
                    IKeyValue keyValue;
                    if (propRef == null)
                    {
                        keyValue = model.Owner.Identifier;
                    }
                    else
                    {
                        keyValue = (IKeyValue)model.Owner.GetProperty(propRef).Value;
                    }
                    DependantValue key = new DependantValue(model.CollectionTable, keyValue);
                    if (subnode.Attributes["on-delete"] != null)
                    {
                        key.IsCascadeDeleteEnabled = "cascade".Equals(subnode.Attributes["on-delete"].Value);
                    }
                    BindSimpleValue(subnode, key, model.IsOneToMany, Mapping.Collection.DefaultKeyColumnName);
                    if (key.Type.ReturnedClass.IsArray)
                    {
                        throw new MappingException("illegal use of an array as an identifier (arrays don't reimplement Equals)");
                    }
                    model.Key = key;


                    XmlAttribute notNull = subnode.Attributes["not-null"];
                    key.SetNullable(notNull == null || IsFalse(notNull.Value));
                    XmlAttribute updateable = subnode.Attributes["update"];
                    key.SetUpdateable(updateable == null || IsTrue(updateable.Value));
                }
                else if ("element".Equals(name))
                {
                    var elt = new SimpleValue(model.CollectionTable);
                    model.Element = elt;
                    if (model.IsGeneric)
                    {
                        switch (model.GenericArguments.Length)
                        {
                        case 1:
                            // a collection with a generic type parameter
                            elt.TypeName = model.GenericArguments[0].AssemblyQualifiedName;
                            break;

                        case 2:
                            // a map (IDictionary) with 2 parameters
                            elt.TypeName = model.GenericArguments[1].AssemblyQualifiedName;
                            break;
                        }
                    }
                    BindSimpleValue(subnode, elt, true, Mapping.Collection.DefaultElementColumnName);
                }
                else if ("many-to-many".Equals(name))
                {
                    ManyToOne element = new ManyToOne(model.CollectionTable);
                    model.Element = element;
                    BindManyToOne(subnode, element, Mapping.Collection.DefaultElementColumnName, false);
                    BindManyToManySubelements(model, subnode);
                }
                else if ("composite-element".Equals(name))
                {
                    Component element = new Component(model);
                    model.Element = element;
                    BindComponent(subnode, element, null, null, null, model.Role + ".element", true, inheritedMetas);
                }
                else if ("many-to-any".Equals(name))
                {
                    Any element = new Any(model.CollectionTable);
                    model.Element = element;
                    BindAny(subnode, element, true);
                }
                else if ("jcs-cache".Equals(name) || "cache".Equals(name))
                {
                    XmlAttribute usageNode = subnode.Attributes["usage"];
                    model.CacheConcurrencyStrategy = (usageNode != null) ? usageNode.Value : null;
                    XmlAttribute regionNode = subnode.Attributes["region"];
                    model.CacheRegionName = (regionNode != null) ? regionNode.Value : null;
                }
            }
        }