【问题标题】:NHibernate: Add entity to many-to-many collection by id onlyNHibernate:仅通过 id 将实体添加到多对多集合
【发布时间】:2011-12-03 23:40:49
【问题描述】:

我正在寻找捷径。我有一些具有多对多关系的 NH 实体。像这样的:

public class Customer : EntityBase<Customer>
{
    public virtual IList<Category> Categories { get; set; }
}

public class Category : EntityBase<Category>
{
    public virtual IList<Customer> Customers { get; set; }
}

请记住,这是一个非常简单的描述,所以不要建议我不要使用多对多安排,或者我应该使用值类型或类似的东西。

在 DB 端,这种关系是通过一个包含两列的单独表完成的 - Customer_IdCategory_Id

我真的希望能够将现有的Category 添加到Customer,而无需从数据库中检索完整的实体。也许是这样的:

customerEntity.Categories.Add(new Category { Id = 2 });

这样做的原因是该应用程序是一个 ASP.NET MVC 应用程序,并且我正在使用 ViewModels 作为我的视图。这些Customer ViewModels 最终以List&lt;int&gt; 用于类别选择,当我将该ViewModel 映射到相应的Customer 实体时,我希望能够将这些类别ID 吸进@987654330 @list 而不必先访问数据库来检索它们。

我希望能够做到这一点的部分原因是我想尽量减少数据库调用,但我也想让我的映射器类能够创建Customer 实体而无需进行调用到我的服务层去询问其他对象……这似乎是糟糕的设计。我还想避免必须添加另一个层来调用映射器,然后执行从存储库中提取实体的其他映射内容(它本身是通过域服务层访问的)。

我查看了idbag,但其中一个我使用的是 Fluent NHibernate,但它不支持该构造,另外两个我可以从文档中收集到,这将给我一个关于实体的 List&lt;int&gt; ,并且我仍然希望能够访问这些集合中的完整实体。

我对 NHibernate 的要求是否过高?

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    使用ISession.Load:

    customerEntity.Categories.Add(session.Load<Category>(2));
    

    Load 将返回一个代理并且不会命中数据库。您可以在不访问数据库的情况下访问代理的 ID 属性,但如果您访问任何其他属性,NHibernate 将加载代理。

    【讨论】:

    • 不幸的是,我的会话没有直接暴露给 ASP.NET MVC 应用程序。我必须调用另一个库中的存储库。我希望我的 ViewModel 映射器必须直接与存储库层对话。有什么办法吗?
    • 好吧,让我纠正一下 - 我通常不会从 MVC 应用程序访问会话。
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多