C# NHibernate POCO/基础知识

C# NHibernate POCO/基础知识,c#,nhibernate,mapping,poco,C#,Nhibernate,Mapping,Poco,我以前使用过L2S,现在正在考虑在项目中使用NHib和Sharp架构。我已经开始制作原型,遇到了第一个问题,我不知道如何用谷歌搜索 给定一个具有一些简单属性和一个引用属性(此处未显示类别-类)的POCO: 如果我想说生成一个表格格式的帖子摘要,这很方便——如果我想要一个名为“Category”的列,并且我想显示类别标题,我可以简单地使用Post.Category.title 但是,用户会创建一个新帖子(他们从下拉列表或类似列表中选择一个类别)。他们单击submit,我就创建了一个新的Post对象

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

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

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

但是,用户会创建一个新帖子(他们从下拉列表或类似列表中选择一个类别)。他们单击submit,我就创建了一个新的Post对象。但是,在我可以持久化新帖子之前,我必须检索类别的实例(按id)以分配给Category属性

如何做到两全其美?如果我更新Post POCO,将类别设置为int,那么创建新实例就更简单了。但是对于一些现在必须解析给定Id的类别名称的渲染代码来说更难

我觉得我缺少一些基本的概念

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

如何在NHibernate中实现类似?这通常是如何管理的


谢谢

相关实体应映射为实体-例如,
类别
,而不是
int CategoryId

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

post.Category = (Category) sesssion.Load(typeof(Category), categoryId);
您还可以使用通用版本:

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

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

使用fluent映射,它看起来像这样:

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" />

当没有关联的类别时,可以使用“未找到”来拾取行为


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

Sry,请原谅我的缓慢。。。PropertyRef有什么影响?我刚刚又在谷歌上搜索了一遍,fluentnhibernate propertyref并没有找到多少有用的内容:-)在本例中,它引用了Category对象的Id属性,并将其绑定到Post中的CategoryId列。(我可能应该使用category_id来与我的xml映射示例保持一致)。谢谢回复。这个场景是web(asp.net mvc),我正在尝试避免在回发时对Db进行过多的查找,只是为了重新填充基本上是查找或引用的数据,以便持久化可能有许多关联实体的实体。Load方法看起来很棒(我应该考虑一下,但作为一名新手,我需要更加熟悉NHib——这本书即将面世)。
<many-to-one name="Category" column="category_id" class="YourNamespace.Category" cascade="all" property-ref="Id" />