5

我以前使用过 L2S,现在正在考虑在一个项目中使用 NHib 和 Sharp 架构。我已经开始制作原型并遇到了我不知道如何用谷歌搜索的第一个问题。

给定一个具有一些简单属性和一个参考属性的 POCO(类别 - 此处未显示的类):

public class Post
{
  public Post()
  {
    this.DateCreated = DateTime.Now;
  }

  public virtual string Title {get;set;}
  public virtual DateCreated {get;set;}
  public virtual Category {get;set;}
}

如果我想说以表格格式生成帖子摘要,这很方便 - 如果我想要一个名为“类别”的列并且我想显示类别标题,我可以简单地使用 Post.Category.Title。

然而,用户创建了一个新帖子(他们从下拉列表或类似列表中选择一个类别)。他们点击提交,我新建了一个 Post 对象。但是,在我可以保留新帖子之前,我必须检索类别的一个实例(按 id)以分配给类别属性?

如何两全其美?如果我更新 Post POCO,使 Category 成为 int,我可以更简单地创建新实例。但是对于一些现在必须解析给定 Id 的类别名称的渲染代码来说更难?

我觉得我在这里缺少一些基本概念?

我知道使用 Linq to Sql 给定一个架构,其中 Post 表有一个名为 CategoryId 的整数外键列,会生成基础表列 (CategoryId) 和包含外键行的 EntitySet。

如何在 NHibernate 中实现类似的功能?这一般是如何管理的?

谢谢

4

2 回答 2

4

关联的实体应该被映射为实体——例如Category,不是int CategoryId

当您创建一个 newPost时,如果您没有实际Category实例(为什么没有?如果您从列表中选择类别,您已经加载了它们)但只有它的 id,您可以使用Load()在实际访问数据库的情况下获取给定 id 的持久 Category 实例的方法:

post.Category = (Category) sesssion.Load(typeof(Category), categoryId);

您还可以使用通用版本:

post.Category = session.Load<Category>(categoryId);
于 2009-11-19T00:23:10.737 回答
1

在 NHibernate 中,您将使用引用属性。

使用流利的映射,它看起来像这样:

mapping.References(x => x.Category, "CategoryId").PropertyRef(x=>x.Id).Cascade.All();

在 XML 中,大致是

<many-to-one name="Category" column="category_id" class="YourNamespace.Category" cascade="all" property-ref="Id" />

当没有关联的类别时,您可以使用 not-found 来选择行为。

本质上,您需要类别对象的语义,而不是 ID,因此您只需告诉 NHibernate 它们是如何关联的。

于 2009-11-19T00:23:38.583 回答