流利的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获得麦当劳时,我还将在实体中看到正确的数据库。

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

Wendys.Competitors

我看不到麦当劳。我能理解为什么,因为温迪小时候被添加到麦当劳。

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

我在本地测试中提出了以下解决方案。实际上,我并不真正满意,因为我希望得到更好的支持。也许有。如果有人找到它,请发布。

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

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");

当您说明它不适用于此问题时。但是,从fluentnhibrenate的git仓库中提供的示例中,它还是包含列表的添加。
通过将员工添加到商店中," 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);
    }
}

我特别不喜欢的是对竞争对手的检查。不知道它的性能和行为。但是没有您可以一遍又一遍地添加相同的竞争对手。使清单很长。

我是Fluentnhibnate的新手。也许某些设置可以防止双重添加。我对那种环境感兴趣。

相关内容

最新更新