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

nHibernate帮助映射具有多个外键的实体

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

    我如何在nhibernate中映射这种关系(我使用拍卖示例的简单概念来演示这个问题)

    数据库表/实体:
    用户-包含用户
    物品-待售物品(如易趣)
    出价-记录用户对项目的出价

    我想象投标表的样子是这样的:
    id(pk)、itemid(fk)、userid(fk)、amount、transactionDate

    使用映射文件,例如:

    <class name="Bid">
      <id name="Id" class="guid">
        <generator class="guid.comb" />
      </id>
      <many-to-one
        name="Item"
        column="ItemId"
        class="Item"
        not-null="true" />
      <many-to-one
        name="User"
        column="UserId"
        class="User"
        not-null="true" />
      <property name="Amount" type="Double" not-null="true" />
      <property name="TransactionDate" type="DateTime" not-null="true" />
    </class>
    

    在代码(vb.net抱歉)中,如果您添加了一个简单的方便方法,它看起来会像这样,但似乎不太好:

    Public Class Item
    
      '...
    
      Public Sub AddBid(ByVal bid as Bid, ByVal user as User)
          bid.User = user
          bid.Item = Me
          Bids.Add(bid)
      End Sub
    
    End Class
    

    但我想我一定是这个设计错了……我想用一个复合键,但这似乎更错了……任何帮助都非常感谢!

    1 回复  |  直到 16 年前
        1
  •  0
  •   Aaronaught    16 年前

    我看不出问题所在。一个用户可以进行多个投标,一个项目可能有多个投标。在任何实际数据库中,对于某些表来说,拥有多个FK/关系都是很常见的,而且您的映射代码在我看来是正确的。

    (P.S.我假设你也有 bag 中的[或类似项] Item User 地图。。。如果这就是你遇到的问题,你应该特别提一下。)

    编辑:实际上有一件事我可能会改变,那就是实用方法本身。通常情况下,你没有理由在 项目 类,而是使用存储库模式,该模式将 ISession 并具有如下方法签名:

    public void AddBid(User user, Item item, Decimal amount) ...
    

    或者甚至:

    public void AddBid(Guid userID, Guid itemID, Decimal amount) ...
    

    你得到了这个想法-关键是这个方法没有附加到一个特定的实体,它附加到了一个 工作单位 . 我觉得这是一个更好的设计的DAL,但这只是一种方式,真的没有什么。 错误的 和你一起。

    推荐文章