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

时间:2009-12-30 03:57:49

标签: database-design nhibernate-mapping

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

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

我在想象投标表看起来像这样:
Id(PK),ItemId(FK),UserId(FK),金额,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 个答案:

答案 0 :(得分:0)

我没有看到问题。用户可以进行多次出价,并且单个项目可能有多个出价。在任何现实世界的数据库中,一些表有多个FK /关系,并且你的映射代码看起来对我来说很常见。

(PS我假设你在bagItem地图中也有User个[或类似] ...如果这就是你遇到的问题,你应该特别提到。)

编辑:实际上有一件事我可能会改变,那就是实用方法本身。通常你没有理由在Item类中添加类似的东西,而是使用存储库模式,它包含ISession并具有方法签名,如:

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

或者甚至可能:

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

您明白了 - 关键是该方法未附加到特定实体,而是附加到工作单元。我觉得它对DAL来说是一个更好的设计,但它只是一种方式,并且与你的错误并没有。