代码之家  ›  专栏  ›  技术社区  ›  chester89

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

  •  0
  • chester89  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  1
  •   quentin-starin    16 年前

    在NHibernate中,它非常简单和直接。下面是域类的外观,后面是fluent映射。这假设您将使用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);
      }
    }
    
        2
  •  1
  •   Nathan Fisher    16 年前

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

        3
  •  0
  •   dcp    16 年前

    对于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_ADDRESS
    

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

    PERSON
    ADDRESS
    

        4
  •  0
  •   Alex Kofman    16 年前

    例如在 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; }
    }