Соотношение «многие ко многим» с использованием Fluent Nhibernate Automapping - PullRequest
1 голос
/ 17 февраля 2012

Мы сталкиваемся с проблемой применения отношения «многие ко многим», используя свободное автоматическое отображение nhibernate.

Упрощенная форма модели предметной области выглядит следующим образом:

public class Group
{
    private readonly IList<Recipient> _recipients = new List<Recipient>();
    public virtual IList<Recipient> Recipients
    {
        get { return _recipients; }
    }
}

public class Recipient
{
    private readonly IList<Group> _groups = new List<Group>();
    public virtual IList<Group> Groups
    {
        get { return _ groups; }
    }
}

Поскольку приведенный выше код описывает, что группа и получатель имеют отношения «многие ко многим». Мы используем автоматическую функцию беглого nhibernate, чтобы отобразить нашу модель домена с базой данных. Итак, нам нужно было использовать Конвенцию для автопреобразования. Ниже приведен код, который мы использовали для соглашения многих ко многим: -

public class ManyToManyConvention : IHasManyToManyConvention
{
    #region IConvention<IManyToManyCollectionInspector,IManyToManyCollectionInstance> Members

    public void Apply(FluentNHibernate.Conventions.Instances.IManyToManyCollectionInstance instance)
    {
        if (instance.OtherSide == null)
        {
            instance.Table(
               string.Format(
                   "{0}To{1}",
                   instance.EntityType.Name + "_Id",
                   instance.ChildType.Name + "_Id"));
        }
        else
        {
            instance.Inverse();
        }
        instance.Cascade.All();
    }

    #endregion
}

Я нашел это решение здесь:

http://blog.vuscode.com/malovicn/archive/2009/11/04/fluent-nhibernate-samples-auto-mapping-part-12.aspx#Many%20to%20Many%20convention

Но в приведенном выше коде во время отладки время для Recipients-> Groups и для Groups-> Recipients instance .OtherSide идет не равным NULL. Предположение было 1-й раз, когда instance.OtherSide будет не нулевым, а во второй раз он будет нулевым, так как отношения применяются с одной стороны, поэтому мы просто применим обратное к этому. Таким образом, он создает 2 одинаковые таблицы сопоставления. Загружается в базу данных, чтобы иметь 2 таблицы одинаковой схемы. Даже когда я пытаюсь сохранить нашу модель предметной области в базе данных, используя отношения «многие ко многим». Он сохраняет только одну сторону, т.е. он сохраняет получателей в группах, но не сохраняет группы в получателях. В базе данных также имеется запись только в одной таблице сопоставления, но не в обеих.

Итак, вопрос в том, правильно ли мы поступаем? Если нет, то как это сделать.

1 Ответ

2 голосов
/ 17 февраля 2012

вы можете принять обратное себе в качестве критерия

    public void Apply(IManyToManyCollectionInstance instance)
    {
        Debug.Assert(instance.OtherSide != null);
        // Hack:  the cast is nessesary because the compiler tries to take the Method and not the property
        if (((IManyToManyCollectionInspector)instance.OtherSide).Inverse)
        {
            instance.Table(
               string.Format(
                   "{0}To{1}",
                   instance.EntityType.Name + "_Id",
                   instance.ChildType.Name + "_Id"));
        }
        else
        {
            instance.Inverse();
        }
        instance.Cascade.All();
    }
...