我正在寻找一条捷径。我有一些具有多对多关系的 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_Id
和 Category_Id
.我真的很想能够添加一个现有的
Category
到 Customer
无需从数据库中检索完整实体。也许是这样的: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/