【问题标题】:NHibernate POCO / BasicsNHibernate POCO / 基础
【发布时间】:2010-12-18 02:51:03
【问题描述】:

我以前使用过 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 中实现相似?这一般是如何管理的?

谢谢

【问题讨论】:

    标签: c# nhibernate mapping poco


    【解决方案1】:

    关联实体应映射为实体 - 例如Category,不是int CategoryId

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

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

    您也可以使用通用版本:

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

    【讨论】:

    • 感谢您的回复。这种情况是 web (asp.net mvc),我正在考虑避免在回发时对 Db 进行过多的查找 just 以重新填充本质上的查找或引用数据,以便保留一个可能有许多关联实体。 Load 方法看起来很棒(我应该考虑一下,但作为一个新手,我需要更加熟悉 NHib - 这本书正在编写中)。
    【解决方案2】:

    在 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 它们是如何关联的。

    【讨论】:

    • 对不起,请原谅我的慢... PropertyRef 有什么作用?我刚刚再次用谷歌搜索,fluentnhibernate propertyref 并没有挖掘出很多看起来有用的东西:-)
    • 在这种情况下,它引用 Category 对象的 Id 属性,将其绑定到 Post 中的 CategoryId 列。 (我可能应该使用 category_id 来与我的 xml 映射示例保持一致)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2023-03-30
    • 2022-09-29
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多