ORM如何解决实体之间的双向关系(例如,NHibernate)?

ORM如何解决实体之间的双向关系(例如,NHibernate)?,orm,ado.net,entity-relationship,bidirectional,Orm,Ado.net,Entity Relationship,Bidirectional,我正在为我的RDBMS课程写作业,我需要在非常简单的域上执行CRUD操作,这就是赛博体育锦标赛。 要求学生使用ADO.NET。我的问题是如何解决双向关系,例如1:m(每个锦标赛有许多比赛,但每个比赛只属于一个确切的锦标赛)?在我看来,这一定有一些技巧。 我最感兴趣的部分是——像EF或NHibernate这样的ORM是如何解决这种情况的?看看如何构建自己的数据访问层。他谈到了所有这些挑战。对于Hibernate中的多对多,您定义了这种关系。以下是一个示例(参考文献为: PERSON_ADDRESS

我正在为我的RDBMS课程写作业,我需要在非常简单的域上执行CRUD操作,这就是赛博体育锦标赛。
要求学生使用ADO.NET。我的问题是如何解决双向关系,例如1:m(每个锦标赛有许多比赛,但每个比赛只属于一个确切的锦标赛)?在我看来,这一定有一些技巧。

我最感兴趣的部分是——像EF或NHibernate这样的ORM是如何解决这种情况的?

看看如何构建自己的数据访问层。他谈到了所有这些挑战。

对于Hibernate中的多对多,您定义了这种关系。以下是一个示例(参考文献为:

PERSON_ADDRESS表将包含PERSON_id和ADDRESS_id,以将两个实体链接在一起。因此,一个人可以有多个地址,并且给定的地址可能属于多个人或多家公司

对于一段1:m的恋情来说,有这样的关系就足够了:

PERSON
ADDRESS

在address中,您将有person\u id列,但对于给定的person\u id,可能有许多地址记录,从而提供1:m功能。

在NHibernate中,它非常简单和直接。下面是域类的外观,后面是流畅的映射。这假设您将使用NHibernate生成架构。如果如果您正在映射一个遗留数据库,那么设置使用的列名和表名就很简单了

public class Championship {
  public virtual int Id { get; set; }
  public virtual IList<Match> Matches { get; set; }
}


public class Match {
  public virtual int Id { get; set; }
  public virtual Championship Champioship { get; set; }
}


public class ChampionshipMap : ClassMap<Championship> {
  public ChampionshipMap() {
    Id(x => x.Id);
    HasMany(x => x.Matches);
  }
}


public class MatchMap : ClassMap<Match> {
  public MatchMap () {
    Id(x => x.Id);
    References(x => x.Championship);
  }
}
公开课冠军赛{
公共虚拟整数Id{get;set;}
公共虚拟IList匹配{get;set;}
}
公开课比赛{
公共虚拟整数Id{get;set;}
公开虚拟锦标赛冠军{get;set;}
}
公共类ChampionshipMap:ClassMap{
公众支持地图(){
Id(x=>x.Id);
HasMany(x=>x.Matches);
}
}
公共类匹配映射:类映射{
公共匹配图(){
Id(x=>x.Id);
参考文献(x=>x.0);
}
}
例如,在中,您可以编写以下内容以自动关联
champion.Matches
实体集和
Match.champion
持久字段

[HierarchyRoot]
public class Championship : Entity
{
  [Field, Key]
  public int Id { get; set; }

  [Field, Association(PairTo="Championship")]
  public EntitySet<Match> Matches { get; private set; }
}

[HierarchyRoot]
public class Match : Entity
{
  [Field, Key]
  public int Id { get; set; }

  [Field]
  public Championship Championship { get; set; }
}
[HierarchyRoot]
公开课冠军:实体
{
[字段,键]
公共int Id{get;set;}
[场地、协会(PairTo=“锦标赛”)]
公共EntitySet匹配{get;private set;}
}
[层次根]
公共类匹配:实体
{
[字段,键]
公共int Id{get;set;}
[现场]
公开锦标赛{get;set;}
}

好的,我明白了。但是如果我手工构建DAL,我该怎么做呢?我的意思是,如果我需要加载冠军对象,我需要加载它的所有比赛,这将需要为每场比赛加载冠军,等等……我一定错过了一些东西如果你担心它的循环引用,垃圾收集会处理好的。显然,您不能要求比赛的ctor中包含冠军,也不能要求锦标赛的ctor中包含比赛列表。但是..您可以让比赛在ctor中获得冠军,但在锦标赛中初始化比赛列表为空,然后用冠军填充。Matches.Add(new Match(){…});至于DAL,我建议您阅读存储库、数据访问对象(Dao)和活动记录模式。我通常自己使用Dao。
public class Championship {
  public virtual int Id { get; set; }
  public virtual IList<Match> Matches { get; set; }
}


public class Match {
  public virtual int Id { get; set; }
  public virtual Championship Champioship { get; set; }
}


public class ChampionshipMap : ClassMap<Championship> {
  public ChampionshipMap() {
    Id(x => x.Id);
    HasMany(x => x.Matches);
  }
}


public class MatchMap : ClassMap<Match> {
  public MatchMap () {
    Id(x => x.Id);
    References(x => x.Championship);
  }
}
[HierarchyRoot]
public class Championship : Entity
{
  [Field, Key]
  public int Id { get; set; }

  [Field, Association(PairTo="Championship")]
  public EntitySet<Match> Matches { get; private set; }
}

[HierarchyRoot]
public class Match : Entity
{
  [Field, Key]
  public int Id { get; set; }

  [Field]
  public Championship Championship { get; set; }
}