NHibernate:仅通过id将实体添加到多对多集合

时间:2011-10-09 14:22:37

标签: nhibernate fluent-nhibernate

我正在寻找捷径。我有一些具有多对多关系的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; }
}

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

在数据库方面,这种关系是通过一个包含两列的单独表格完成的 - Customer_IdCategory_Id

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

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

原因是该应用程序是一个ASP.NET MVC应用程序,我正在使用ViewModels来查看我的视图。这些Customer ViewModel以类别选择的List<int>结尾,当我将ViewModel映射到相应的Customer实体时,我很想能够吸引那些类别ID到Categories列表中,而不必先命中数据库来检索它们。

我希望能够做到这一点的部分原因是我想最小化数据库调用,但我也想让我的mapper类能够创建Customer实体而不必调用我的服务层去寻求其他对象......这看起来像是糟糕的设计。我还想避免添加另一个层来调用映射器,然后执行从存储库中获取实体的其他映射内容(它本身通过域服务层访问)。

我检查了idbag,但是对于一个我正在使用Fluent NHibernate并且它不支持该构造,并且我可以从文档中收集两个来给我一个{{1}在实体上,我仍然希望能够访问这些集合中的完整实体。

我对NHibernate的要求太高了吗?

1 个答案:

答案 0 :(得分:3)

使用ISession.Load

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

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