流利的多对多关系不起作用

时间:2016-01-13 00:38:11

标签: mysql nhibernate fluent-nhibernate fluent fluent-nhibernate-mapping

我正在使用Fluent自动化程序为代码优先的NHibernate项目(MySql配置)创建配置,并且我在实现有效的多对多关系时遇到问题。举个例子,假设我想要一个Stores表和一个Employees表。员工可以在多家商店工作,当然每家商店都有多名员工在那里工作。所以我给商店实体一个像这样的员工名单:

public class Store
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Employee> Employees { get; set; }

    public Store()
    {
        this.Employees = new List<Employee>();
    }
}

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

创建此数据库会导致自动创建商店和员工表,但不会在两者之间映射表。我可以创建这两种实体类型,将员工添加到商店的员工列表中并保存它而不会遇到错误,但尝试重新加载它会导致列表为空。但是,如果我将这样的商店列表添加到员工记录中......

public class Employee
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Store> Stores { get; set; } // <----

    public Employee()
    {
        this.Stores = new List<Store>();
    }
}

...并使用Employee实体填充商店列表,然后在db中显示storestoemployees表,一切正常。

在我看来,要求我的应用程序中的所有多对多关系在两个实体中都需要列表,只要它们只需要出现在一个实体中,在Entity declation本身和所有代码中都是低效的现在必须两次添加东西。我在这里做错了什么,或者我有办法覆盖Fluent正在做的任何默认映射吗?

1 个答案:

答案 0 :(得分:1)

有一个集合,FNH无法决定使用一对多还是多对多,并且默认为一对多。您可以通过覆盖选择性地覆盖它。

AutoMap.Assembly...
    .Override<Store>(m => m.HasManyToMany(s => s.Employees).Table("store_to_employee"));