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

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

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

在 DB 端,这种关系是通过具有两列的单独表来实现的 - Customer_IdCategory_Id .

我真的很想能够添加一个现有的 CategoryCustomer无需从数据库中检索完整实体。也许是这样的:
customerEntity.Categories.Add(new Category { Id = 2 });

这样做的原因是该应用程序是一个 ASP.NET MVC 应用程序,我使用 ViewModels 作为我的 View 。这些 Customer ViewModels 以 List<int> 结束对于类别选择,以及当我将该 ViewModel 映射到相应的 Customer 时实体,我希望能够将这些类别 ID 吸入 Categories列表而不必先访问数据库来检索它们。

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

我签了 idbag ,但是对于一个我使用 Fluent NHibernate 并且它不支持该构造,对于两个我可以从文档中收集到的内容,这些文档会给我一个 List<int>在实体上,我仍然希望能够访问这些集合中的完整实体。

我对 NHibernate 要求太多了吗?

最佳答案

使用 ISession.Load :

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

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

关于NHibernate:仅通过 id 将实体添加到多对多集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704165/

相关文章:

c# - 有没有办法在 nhibernate 中进行反向查找?

nhibernate - 如何使用 Fluent NHibernate 的类映射来映射 IDictionary<string, string> 并测试该映射?

c# - 按子列表属性排序父对象列表

c# - 如何在 Linq to NHibernate 中使用按位运算符查询枚举标志

c# - 流利的 NHibernate : Issue with many-to-many relationship with custom intermediary table

c# - CaSTLe ActiveRecord 的 ActiveRecordMediator<> 支持 LINQ 吗?

c# - NHibernate Query to json 结果出乎意料

c# - 有没有办法让 NHibernate 将字符串键视为不区分大小写?

nhibernate - 如何使用流畅的 NHibernate 将枚举映射为 int 值?

c# - 无法创建 FluentNHibernate.Automapping.AutoMapping Namespace.Class[T] 的实例,因为 Type.ContainsGenericParameters 为真