Свободное отношение Nhibernate «Многие ко многим» / Иерархия зависимостей - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь создать тестовое приложение, которое показывает зависимости событий: то есть результирующий график зависимостей (в отличие от просто графа дерева).Что-то вроде:

public class Event() {
    public virtual int Id {get;set;}
    public virtual IList<Event> Dependencies {get;set;}
}

Другое требование заключается в том, что я могу обходить график в обоих направлениях: при любом одном событии я могу получить доступ к его зависимостям, а также к его предпосылкам с помощью Nhibernate.

Многие события могут зависеть от одного происходящего ... но также любое данное событие может зависеть от многих других событий.Как должна выглядеть модель (или для этого требуется более одной модели)?Как это можно сопоставить с помощью Fluent NHibernate?И есть ли конфигурация / отображение, которое защитило бы от циклических ссылок?

Ответы [ 2 ]

0 голосов
/ 13 июля 2012

Решение, с которым я столкнулся (пока) ...

В модели:

    public virtual IList<Event> Dependencies{ get; set; }
    public virtual IList<Event> Prerequisites{ get; set; }

В сопоставлении:

        HasManyToMany(x => x.Dependencies)
            .Table("Dependencies")
            .ChildKeyColumn("Dependent");
        HasManyToMany(x => x.Prerequisites)
            .Table("Prerequisites")
            .ChildKeyColumn("Prerequisite");

И я предотвращаю круговые ссылки, ища ложное из:

    private bool IsPrerequisiteEvent(Event dependent, Event prereq)
    {
        bool isPrereq = false;
        if (prereq == null)
            isPrereq = false;
        else if (dependent.Id == prereq.Id)
            isPrereq = true;
        else 
        {
            int i = 0;
            while (!isPrereq && i < dependent.PrerequisiteEvents.Count)
            {
                isPrereq |= IsPrerequisiteEvent(dependent.PrerequisiteEvents[i], prereq);
                i++;
            }
        }
        return isPrereq;
    }

    private bool IsDependentEvent(Event prereq, Event dependent)
    {
        bool isDependent = false;
        if (prereq == null)
            isDependent = false;
        else if (dependent.Id == prereq.Id)
            isDependent = true;
        else
        {
            int i = 0;
            while (!isDependent && i < dependent.DependentEvents.Count)
            {
                isDependent |= IsDependentEvent(prereq, dependent.DependentEvents[i]);
                i++;
            }
        }
        return isDependent;
    }

У этого подхода есть компромиссы: db IS денормализован, но мне не нужно создавать новый объект зависимости и заполнять список зависимых / prereq заявок для каждого билета, а затем делать мои проверки. Кажется, проще написать этот способ сейчас. Хотя открыты для предложений!

0 голосов
/ 05 марта 2012

Мы делаем что-то похожее на это, и способ его отображения заключается в том, что зависимые события должны иметь столбец, который сопоставляется с родительским событием. Это создает необходимые родительские и дочерние отношения, которые вам необходимы для того, чтобы отображение было действительным и предотвращало какую-то циклическую ссылку. Мы перешли на NH 3.2 с помощью сопоставления кода, поэтому мой беглый может быть немного дрянным, но вот мое лучшее предположение:

public class EventMap : ClassMap<Event>
{
    public EventMap()
    {
       //the normal ID and property stuff

       References(x => x.ParentEvent).Column("ParentEventId");

       HasMany(x => x.Dependencies).KeyColumn("ParentEventId");
    }
}

Edit:

Извините - не видел, что вы хотели HasManyToMany. Это может выглядеть примерно так:

public class EventMap : ClassMap<Event>
    {
        public EventMap()
        {
           //the normal ID and property stuff

           HasManyToMany(x => x.Dependencies).Table("EventDependentEvent").AsBag();
        }
    }

Это должно отобразить таблицу ссылок, которая вам понадобится. Вам нужно будет защититься от некоторой степени «округлости», то есть убедиться в том, что в вашей бизнес-логике вы не можете создать цикл или какую-то проблему с массивной зависимостью графов объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...