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