如何使用Fluent NHibernate

时间:2017-02-06 19:32:30

标签: c# orm fluent-nhibernate

我有一个产品表:

产品编号
产品描述
类别ID

类别表:

的CategoryId
CategoryDe​​scription

***对于每件产品,我都希望显示如下一行:

产品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();

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

我是Fluent-NHibernate的新手,在这方面投入了相当多的时间,但我觉得我无处可去。我很感激一些指导性的指导。

1 个答案:

答案 0 :(得分: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
        });

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