Свободный NHibernate один-ко-многим с промежуточным столом соединения? - PullRequest
4 голосов
/ 27 сентября 2011

У меня проблемы с тем, чтобы заставить Fluent Nhibernate Automapper создавать то, что я хочу. У меня есть две сущности с отношениями один-ко-многим.

class Person
    {
        public string name;
        IList<departments> worksIn;

    }

    class Department
    {
        public string name;
    }

Выше очевидно, что это голые кости, но я ожидал бы создать конкретную схему:

Person{id, name}
Department{id, name}
PersonDepartment{id(FK person), id(Fk Department)}

К сожалению, вместо этого я получаю:

Person{id, name}
Department{id, name, personid(FK)}

Я не хочу, чтобы FK для Person был включен в таблицу отдела, я хочу отдельную таблицу соединения / поиска (PersonDepartment выше), которая содержит первичные ключи обеих таблиц в виде составного PK, а также Fks.

Я не уверен, неправильно ли я рисую свои начальные классы (возможно, это просто LIst workIn - представляющий идентификаторы, а не List worksIn), или мне нужно вручную отобразить это?

Можно ли это сделать?

1 Ответ

0 голосов
/ 27 сентября 2011

То, как классы были структурированы, предполагает отношение «один ко многим» (и именно так вы описываете это в своем вопросе), поэтому неудивительно, что FNH решает смоделировать отношения с базой данных таким образом.

Можно было бы, как вы предлагаете, вручную создать отображение таблицы «многие ко многим». Но действительно ли это то, что вы хотите?

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

Некоторые примеры «голых» классов, иллюстрирующие такую ​​структуру:

public class Person
{
    public int Id { get; set;}

    public string Name { get; set;}

    public IList<PersonDepartment> Departments { get; set; }
}

public class PersonDepartment
{
    public int Id { get; set; }

    public Person Person { get; set; }

    public Department Department { get; set; }

    public bool IsPrimary { get; set; }

    public string Office { get; set; }
}

public class Department
{
    public int Id { get; set; }

    public IList<PersonDepartment> Personnel { get; set; }

    public string Name { get; set; }
}
...