我有一个公司表,我正在尝试建立竞争对手的矩阵。
例如:麦当劳是温迪的竞争对手,反之亦然。
这是我尝试过的映射:
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的新手。也许某些设置可以防止双重添加。我对那种环境感兴趣。