Fluent Nhibernate映射两个数据库表上的单个类

时间:2010-06-12 13:39:59

标签: nhibernate fluent-nhibernate automapping

我遇到了Mapping问题。

我的数据库中有两个表,如下所示:Employee和EmployeeManagers

员工

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以覆盖Employee的自动化,但我不知道该怎么做。

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 :(得分:0)

我做了类似的事情,也许它可以帮助你开始?

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

编辑opps我可以看到它的多个管理员

答案 1 :(得分:0)

我最终这样做

    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
        //http://stackoverflow.com/questions/1547956/fluent-nhibernate-automappings-with-self-reference
        mapping.References( x => x.ParentNode ).Column( "ParentNodeFk" ).Cascade.SaveUpdate();
        mapping.HasMany( x => x.ChildNodes ).Cascade.SaveUpdate().KeyColumn( "ParentNodeFk" );            

    }
}