流畅的NHibernate:单个表上的多对多映射

时间:2017-06-07 18:47:47

标签: c# fluent-nhibernate

我有一张公司表,我正在努力建立他们之间的竞争对手矩阵。

例如:麦当劳是温迪的竞争对手,反之亦然。

这是我尝试过的映射:

HasManyToMany(x => x.Competitors)
.ParentKeyColumn("IssuerID")
.ChildKeyColumn("CompetitorID")
.Table("Competitors")
.Cascade.All().Not.LazyLoad();

以及:

  Table("Issuer");
            Id(x => x.Key).Column("Id").GeneratedBy.Assigned();
            Map(x => x.Name).Length(1000);   
  HasManyToMany(x => x.Competitors).ParentKeyColumn("IssuerID").ChildKeyColumn("CompetitorID").Table("Competitors").Cascade.All().Not.LazyLoad();

当我向竞争者添加竞争对手时,我可以在数据库中看到正确的映射。

所以,如果我这样做:

McDonalds.AddCompetitor(Wendys);

我会在数据库中看到正确的数据。当我使用NHibernate获得McDonalds时,我也会在实体中看到正确的数据库。

但是,如果我从Nhibernate返回Wendy并查看竞争对手的对象:

Wendys.Competitors

我没有看到麦当劳。我能理解为什么因为Wendy被加入麦当劳作为一个孩子。

如何修改此内容以便我可以从两个方向查看竞争对手?

1 个答案:

答案 0 :(得分:2)

我在本地测试中提出了以下解决方案。其实我并不满意,因为我希望有更好的支持。也许有。如果有人发现,请发帖。

拥有这样的商店(缩小到竞争对手的相关部分):

public class Store
{
    public virtual int Id { get; protected set; }

    public virtual IList<Store> Competitors { get; set; }
}

我使用了以下映射(与您相同):

HasManyToMany(x => x.Competitors)
    .ParentKeyColumn("Store_Id")
    .ChildKeyColumn("Competitor_Id")
    .Table("CompetitorsMapping");

正如您所述,它不适用于此。但是从Gluent Repo中提供的fluentnhibernate提供的示例中,无论如何它都包含了列表的添加。
“FirstProject”示例通过将员工添加到商店来执行类似操作。它首先在员工上设置商店,然后将员工添加到商店的员工(好吧有点不同)。但它会自动处理依赖关系。

所以你可以通过不直接设置但通过包装添加和删除来解决你的问题(从你的示例代码看起来你已经这样做了):

public class Store
{
    public virtual void AddCompetitor(Store competitor)
    {
        if (!Competitors.Any(x => x.Id == competitor.Id))
        {
            competitor.Competitors.Add(this);
            Competitors.Add(competitor);
        }
    }

    public virtual void RemoveCompetitor(Store competitor)
    {
        competitor.Competitors.Remove(this);
        Competitors.Remove(competitor);
    }
}

我特别不喜欢的是对竞争对手的包含检查。不知道它的表现和行为。但没有你可以一遍又一遍地添加相同的竞争对手。列表很长。

我是fluentnhibernate的新手。也许某些设置可能会自动阻止双重添加。我对这个环境感兴趣。