Свободное отображение Nhibernate Один класс на две таблицы базы данных - PullRequest
0 голосов
/ 12 июня 2010

У меня проблемы с отображением.

В моей базе данных есть две таблицы: Employee и EmployeeManager

Employee

EmployeeId int Имя nvarchar

EmployeeManagers

EmployeeIdFk int ManagerIdFk int

Таким образом, у сотрудника может быть 0 или более менеджеров. Сам менеджер также является Сотрудником.

У меня есть следующий класс, чтобы представлять сотрудника и менеджеров

public class Employee
{
public virtual int Id
{
    get;
    set;
}

public virtual string Name
{
    get;
    set;
}

public virtual IList<Employee> Managers
{
    get;
    protected set;
}

public Employee()
{
    Managers = new List<Employee>();
}
}

У меня нет класса для представления Manager, потому что я думаю, что в этом нет необходимости, поскольку сам Manager является Сотрудником.

Я использую autoMapping и просто не могу понять, как сопоставить этот класс с этими двумя таблицами. Я реализую IAutoMappingOverride для переопределения автоматических сопоставлений для Сотрудника, но я не уверен, что в нем делать.

public class NodeMap : IAutoMappingOverride
{
    public void Override(AutoMapping<Node> mapping)
    {
        //mapping.HasMany(x => x.ValidParents).Cascade.All().Table("EmployeeManager");
        //mapping.HasManyToMany(x => x.ValidParents).Cascade.All().Table("EmployeeManager");
    }
}

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

Может ли кто-нибудь помочь мне с этим, пожалуйста?

Пользователи Набиль

Ответы [ 2 ]

0 голосов
/ 23 июня 2010

В итоге я делаю вот так

    public abstract class Node
    {
        public virtual int Id
        {
            get;
            set;
        }

        public virtual Node ParentNode
        {
            get;
            set;
        }

        public virtual IList<Node> ChildNodes
        {
            get;
            protected set;
        }

        protected Node()
        {
            ChildNodes = new List<Node>();
        }

        public virtual void AddChildNode( Node childNode )
        {
            childNode.ParentNode = this;
            ChildNodes.Add( childNode );
        }

    }

 public class NodeMap : IAutoMappingOverride<Node>
{
    public void Override( AutoMapping<Node> mapping )
    {
        //self referencing
        ///1269620/svobodnye-avtomaticheskie-sopostavleniya-nhibernate-s-samoreferentsiei
        mapping.References( x => x.ParentNode ).Column( "ParentNodeFk" ).Cascade.SaveUpdate();
        mapping.HasMany( x => x.ChildNodes ).Cascade.SaveUpdate().KeyColumn( "ParentNodeFk" );            

    }
}
0 голосов
/ 15 июня 2010

Я сделал что-то вроде этого, может быть, это могло бы помочь вам начать?

http://www.dbones.co.uk/blog/post/2010/04/Nhib-Self-Reference-Object.aspx

Редактировать оппы, я вижу его несколько менеджеров

Кости

...