我有一张公司表,我正在努力建立他们之间的竞争对手矩阵。
例如:麦当劳是温迪的竞争对手,反之亦然。
这是我尝试过的映射:
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被加入麦当劳作为一个孩子。
如何修改此内容以便我可以从两个方向查看竞争对手?
答案 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的新手。也许某些设置可能会自动阻止双重添加。我对这个环境感兴趣。