我如何在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
但是我想我必须把这个设计弄错了......我想过使用复合键,但这似乎更错了......任何帮助都非常感谢!
答案 0 :(得分:0)
我没有看到问题。用户可以进行多次出价,并且单个项目可能有多个出价。在任何现实世界的数据库中,一些表有多个FK /关系,并且你的映射代码看起来对我来说很常见。
(PS我假设你在bag
和Item
地图中也有User
个[或类似] ...如果这就是你遇到的问题,你应该特别提到。)
编辑:实际上有一件事我可能会改变,那就是实用方法本身。通常你没有理由在Item
类中添加类似的东西,而是使用存储库模式,它包含ISession
并具有方法签名,如:
public void AddBid(User user, Item item, Decimal amount) ...
或者甚至可能:
public void AddBid(Guid userID, Guid itemID, Decimal amount) ...
您明白了 - 关键是该方法未附加到特定实体,而是附加到工作单元。我觉得它对DAL来说是一个更好的设计,但它只是一种方式,并且与你的错误并没有。