Отношения в Хабанеро - PullRequest
2 голосов
/ 27 мая 2011

Я пытался написать некоторый общий код для создания xml-пакета бизнес-объектов Habanero. Код в настоящее время может обрабатывать отношения компоновки, но мне нужно добавить отношения ассоциации вручную. Есть ли способ добавить ассоциативные отношения, которые не имеют составных обратных отношений, более общим способом.

Вот как складываются отношения композиции

    private static void AddRelatedCompositionObjects(Package package, IBusinessObject businessObject)
    {
        businessObject.Relationships
            .Where(rel => rel.RelationshipType == RelationshipType.Composition)
            .Where(rel => rel is IMultipleRelationship)
            .Select(rel => (IMultipleRelationship)rel)
            .ForEach(rel => rel.BusinessObjectCollection
                                .AsEnumerable<IBusinessObject>()
                                //.ForEach(package.Add));
                                .ForEach(bo => BuildPackage(package, bo)));

        businessObject.Relationships
            .Where(rel => rel.RelationshipType == RelationshipType.Composition)
            .Where(rel => rel is ISingleRelationship)
            .Select(rel => (ISingleRelationship)rel)
            //.ForEach(rel => package.Add(rel.GetRelatedObject()));
            .ForEach(rel => BuildPackage(package, rel.GetRelatedObject()));
    }

А потом я вручную добавляю отношения ассоциации

                var package = new Package();
                foreach (var returnDelivery in returnDeliveries)
                {
                    package.Add(returnDelivery);
                    if (returnDelivery != null)
                    {
                        var materials = returnDelivery.DeliveryItems.Select(item => item.Material).Distinct();
                        materials.ToList().ForEach(material =>
                        {
                            package.Add(material);
                            material.EWTMaterials.ForEach(package.Add);
                        });
                        package.Add(returnDelivery.Customer);
                    }
                }

1 Ответ

2 голосов
/ 27 мая 2011

Первое, что нужно понять, это то, что 1) Habanero не требует от вас определения обратных отношений. Хотя, если вы генерируете определения классов из Firestarter, у вас их будет.

Я украл этот образец фрагмента из ClassDefValidator в Habanero.BO, так что он может быть не совсем тем, что вы хотите, и, безусловно, может быть обобщен в архитектуру. Этот фрагмент кода выполняет обратное отношение RelationshipDef для RelationshipDef

.

этот код находится в Habanero.BO.ClassDefValidator

Метод CheckRelationshipsForAClassDef. Если вы посмотрите здесь, вы увидите код для получения relatedClassDef. Преобразовать это в то, что вам нужно, должно быть довольно легко.

Если у вас есть какие-либо проблемы, тогда кричите.

        if (!HasReverseRelationship(relationshipDef)) return;

        string reverseRelationshipName = relationshipDef.ReverseRelationshipName;
        if (!relatedClassDef.RelationshipDefCol.Contains(reverseRelationshipName))
        {
            throw new InvalidXmlDefinitionException
                (string.Format
                     ("The relationship '{0}' could not be loaded for because the reverse relationship '{1}' defined for class '{2}' is not defined as a relationship for class '{2}'. Please check your ClassDefs.xml or fix in Firestarter.",
                      relationshipDef.RelationshipName, reverseRelationshipName, relatedClassDef.ClassNameFull));
        }

        var reverseRelationshipDef = relatedClassDef.RelationshipDefCol[reverseRelationshipName];

Brett

...