0

我正在为我的 RDBMS 课程写作业,我需要在非常简单的域上执行 CRUD 操作,即网络运动锦标赛。
学生必须使用 ADO.NET。我的问题是如何解决双向关系,例如1:m(每个冠军有很多比赛,但每场比赛只属于一个确切的冠军)?在我看来,必须有一些技术。
对我来说最有趣的部分是——像 EF 或 NHibernate 这样的 ORM 是如何解决这种情况的?

4

4 回答 4

1

查看有关构建您自己的数据访问层的Davy Brions 博客。他谈到了所有这些挑战。

于 2009-12-16T20:02:06.193 回答
1

在 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);
  }
}
于 2009-12-16T20:05:37.070 回答
0

对于像 Hibernate 的多对多这样的事情,您可以定义关系。这是一个例子(参考在这里

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <set name="addresses" table="PersonAddress">
        <key column="personId"/>
        <many-to-many column="addressId"
            class="Address"/>
    </set>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <set name="people" inverse="true" table="PersonAddress">
        <key column="addressId"/>
        <many-to-many column="personId"
            class="Person"/>
    </set>
</class>

从数据库本身来看,对于多对多关系,您通常会有一个链接表。

所以我们有:

PERSON
ADDRESS
PERSON_ADDRESS

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

对于 1:m 的关系,有这个就足够了:

PERSON
ADDRESS

在地址中,您将拥有 person_id 列,但给定的 person_id 可能有许多地址记录,从而为您提供 1:m 功能。

于 2009-12-16T20:04:36.213 回答
0

例如,在DataObjects.Net中,您可以编写以下内容以获取自动关联的Championship.Matches实体集和Match.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; }
}
于 2009-12-17T04:59:19.707 回答