【发布时间】:2011-06-08 01:44:58
【问题描述】:
我今天开始使用 NHibernate,但我不知道如何在两个表之间建立简单的关系。我真的不知道它叫什么,它可能是一对多或外键关系(我不喜欢数据库设计和使用的术语),但这里有一个非常简单的例子。
我有一个带有属性 ID (PK)、ProductName 和 CategoryId 的表 Product。然后我有一个带有属性 Id (PK) 和 CategoryName 的表类别。
我创建了这些类:
public class Product
{
public virtual int Id { get; set; }
public virtual string ProductName { get; set; }
public virtual int CategoryId { get; set; }
public virtual Category Category { get; set; }
public virtual string CategoryName
{
get { return this.Category == null ? String.Empty : this.Category.CategoryName; }
}
}
public class Category
{
public virtual int Id { get; set; }
public virtual string CategoryName { get; set; }
}
换句话说,我只是想让 Product 存储它所属的类别(通过 CategoryId 属性,它指向 Categories 表中的 Id)。我不需要 Category 类来保存相关产品的列表,如果这样可以更简单的话。
为了更清楚我所追求的,这是我所期待的 SQL:
SELECT Products.*, Categories.*
FROM Products INNER JOIN Categories ON Products.CategoryId = Categories.Id
至少我认为应该是这样(再说一次,我不擅长数据库设计或查询)。
我不知道我需要哪种映射。我想我需要将它映射到 Product.hbm.xml 文件中。但是我也映射 CategoryId 吗?以及如何映射 Category 属性?
似乎我需要一个“一对多”关系,因为我每个产品都有一个类别(或者这个推理是否倒退?)但似乎没有一对多映射......
感谢您的帮助!
加法:
我尝试在 Person 映射中添加多对一关系,但我不断收到异常提示“创建代理失败”,并且在内部异常中“找到不明确的匹配”。
我可能应该提到我使用的是旧版本的 NHibernate(我认为是 1.2),因为这是我使用 MS Access 运行的唯一一个,因为它在较新版本中找不到 JetDriver。
我已将映射文件、类和代码放在屏幕截图中出现错误的位置,因为我不知道如何在此处发布 XML 代码...它一直将其作为 html 标记读取并跳过其中的一半。无论如何。
映射:
http://www.nickthissen.nl/Images/tmp7B5A.png
课程:
http://www.nickthissen.nl/Images/tmpF809.png
发生错误的加载代码:
http://www.nickthissen.nl/Images/tmp46B6.png
(正如我所说,内部异常说“找到了不明确的匹配项”。
(我的示例中的产品已替换为人员)
Person 和 Category 类继承了 Entity,它是一个抽象基类,定义了 Id、Deleted、CreatedTime 和 UpdatedTime 属性。 发生错误的代码位于通用“管理器”类中(类型参数 TEntity 必须继承实体)。它只是应该加载所有具有已删除属性为假的实体。在这种情况下,TEntity 是“Person”。
如果我在 Person 映射中省略了多对一 Category 映射,它工作正常,但显然 Category 属性始终为 null。
哦,是的,很抱歉 C# 和 VB 之间的混合,C# 代码位于我用于多个项目的通用框架中,而 VB 部分是该框架在我的网站上的实际实现,我只是碰巧使用 VB那个。
帮助?谢谢!
【问题讨论】:
标签: nhibernate mapping key one-to-many