我正在为我的RDBMS课程写作业,我需要在相当简单的域上执行CRUD操作,这是网络运动锦标赛。
学生被要求使用ADO.NET,我的问题是如何解决双向关系,例如1:m (每个冠军有许多比赛,但每个比赛只属于一个确切的冠军)?在我看来,必须要有一些技术来做到这一点。
对我来说最有趣的部分是-像EF或NHibernate这样的对象关系管理是如何解决这种情况的?
发布于 2009-12-17 04:05:37
在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-17 04:02:06
看看Davy Brions Blog中关于构建您自己的数据访问层的内容。他谈到了所有这些挑战。
发布于 2009-12-17 04:04:36
对于像Hibernate中的多对多这样的东西,您可以定义关系。下面是一个示例(引用为here
<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_ADDRESSPERSON_ADDRESS表将包含将两个实体链接在一起的person_id和address_id。因此,一个人可能有多个地址,而一个给定的地址可能属于多个人或公司。
对于1:m的关系,拥有以下内容就足够好了:
PERSON
ADDRESS在address中,您将拥有person_id列,但是对于给定的person_id,可能有许多地址记录,这为您提供了1:m功能。
https://stackoverflow.com/questions/1917258
复制相似问题