如何使用 Fluent NHibernate 从另一个表中获取一列

Posted

技术标签:

【中文标题】如何使用 Fluent NHibernate 从另一个表中获取一列【英文标题】:How to fetch one column from another table using Fluent NHibernate 【发布时间】:2017-02-06 19:32:29 【问题描述】:

我有一个产品表:

产品编号 产品描述 类别编号

还有一个类别表:

类别 ID 分类说明

***对于每个产品,我想显示这样的一行:

产品 ID |产品描述 | 类别说明

我没有成功形成上述任务所需的必要映射。

产品映射我正在使用:

public ProductsMap()

    Table("Products");

    Id(x => x.ProductId);
    Map(x => x.ProductDescription);
    Map(x => x.CategoryId);

    References(x => x.Categories)
        .Column("CategoryId")
        .Not.Nullable();

    // Need Join() statement here?
    ...

我的产品类:

public class Products

    public virtual int ProductId  get; set; 
    public virtual string ProductDescription  get; set; 
    public virtual int CategoryId  get; set; 
    public virtual Category Category  get; set;         
    public virtual int? CategoryDescription  get; set;  // Not in the db table.

我的目标是让 Fluent-NHibernate 通过指定的映射自动填充上述类中的 CategoryDescription 字段。

我使用了this answer 建议的join 语句,但以下语句出现了各种异常:

List<Products> products = session.Query<Products>().ToList();

注意:我可以从数据库中提取所有产品没有类别表中的相应列,所以我知道我的数据库连接性很好,并且应用程序的基本功能是健全的.

我是 Fluent-NHibernate 的新手,在这方面投入了相当多的时间,但我觉得我一无所获。我将不胜感激一些直接的指导。

【问题讨论】:

【参考方案1】:

我有点困惑,因为您似乎混合了单数和复数,但我会为产品和类别创建单独的域映射

public class Product

    public virtual int ProductId  get; set; 
    public virtual string ProductDescription  get; set; 
    public virtual Category Category  get; set; 


public class Category

    public virtual int CategoryId  get; set; 
    public virtual string CategoryDescription  get; set; 

按照您在问题中的映射方式映射它们,然后创建视图模型

public class ProductViewModel

    public virtual int ProductId  get; set; 
    public virtual string ProductDescription  get; set; 
    public virtual string CategoryDescription  get; set; 

使用此查询填充

        var products = session.Query<Products>().Select(p => new ProductViewModel()
        
                ProductId =  p.ProductId,
                ProductDescription = p.ProductDescription,
                CategoryDescription = p.Category.CategoryDescription
        );

这将产生一个只返回您需要的列的查询。如果您返回完整的实体,您将返回不需要的信息。

【讨论】:

非常感谢您!有用。现在我必须了解如何它是如何工作的! :) 您可以推荐有关 Fluent-NHibernate 的任何好的资源吗? PS:我不得不使用这个答案:***.com/a/3402839/360840 来解决演员表问题,但除此之外,它非常完美。 是的,我包含的查询将返回一个 IQueryable。 ToList(), ToArray(),... 将运行查询并填充列表。 关于映射问题,请查看notherdev.blogspot.com/2012/01/mapping-by-code-manytoone.html 我去过那个页面,并把它加了书签,但当时没有意义。我有一本书名为 NHibernate 3 Beginner's Guide [2011] 但它很旧(例如,使用 Null 而不是 Nullable),而且一点也不清晰。在关系数据库基础上花费太多。如果我可以问,你是怎么学的?

以上是关于如何使用 Fluent NHibernate 从另一个表中获取一列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent 设置 NHibernate.Burrow?

如何使用 Fluent-NHibernate 和 MySQL 指定自动递增 (int) 标识列

如何使用 Fluent nhibernate 正确更新行?

如何在 Fluent NHibernate ClassMap 类中指定表名?

使用自动映射时如何使用 Fluent NHibernate Validator?

如何在Fluent NHibernate中映射受保护的集合?