NHibernate POCO / Basics

时间:2009-11-19 00:09:52

标签: c# nhibernate mapping poco

我之前使用的是L2S,我正在考虑在项目中使用NHib和Sharp Architecture。我已经开始进行原型设计并遇到了第一个问题,我不知道如何谷歌搜索。

给定一个带有一些简单属性的POCO和一个引用属性(Category - 类未在此处显示):

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;}
}

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

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

如何充分利用这两个世界?如果我更新Post POCO,使Category成为int,我就更容易创建新实例。但是对于某些渲染代码来说更难,现在必须解析给定Id的类别名称?

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

我知道Linq to Sql给定了一个模式,其中Post表有一个名为CategoryId的整数foriegn键列,它将生成基础表列(CategoryId)和包含外键行的EntitySet。

如何在NHibernate中实现类似效果?这通常如何管理?

由于

2 个答案:

答案 0 :(得分:4)

应将相关实体映射为实体 - 例如Category,而非int CategoryId

当您创建新的Post时,如果您没有实际的Category实例(为什么不呢?如果您从列表中选择类别,那么您已经加载了它们)但只有它的id,你可以使用Load()方法为给定的id 获取持久的Category实例,而不用实际命中数据库:

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

您也可以使用通用版本:

post.Category = session.Load<Category>(categoryId);

答案 1 :(得分: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它们是如何关联的。