RDBMSクラスの宿題を書いていますが、サイバースポーツ選手権である非常に単純なドメインでCRUD操作を実行する必要があります。
学生はADO.NETを使用する必要があります。私の質問は、双方向の関係をどのように解決できるかです。たとえば、1:m(すべてのチャンピオンシップには多くの試合がありますが、すべての試合は1つの正確なチャンピオンシップにのみ属します)?そのためのテクニックが必要だと私には思えます。
そして、私にとって最も興味深い部分は、EFやNHibernateのようなORMがこの状況をどのように解決するかということです。
4 に答える
独自のデータアクセス層の構築については、DavyBrionsブログをご覧ください。彼はそれらすべての種類の課題について話します。
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);
}
}
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テーブルには、2つのエンティティをリンクするためのperson_idとaddress_idが含まれます。したがって、1人の人が多くの住所を持つ可能性があり、特定の住所が複数の人または会社に属する可能性があります。
1:mの関係の場合、これで十分です。
PERSON
ADDRESS
addressには、person_id列がありますが、特定のperson_idに対して多くのアドレスレコードが存在する可能性があり、1:mの機能が提供されます。
For example in DataObjects.Net you can write following to get automatically associated Championship.Matches
entity set and Match.Championship
persistent field.
[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; }
}