Fluent NHibernate 组件映射问题

Fluent NHibernate Component Mapping issue

我有一个 SQL 服务器存储过程,我正在使用一个 returns 一个 table 的查询字符串执行它,其中包含以下列(ItemNumber、ItemDescription、UPC、Price、 Count) 代表一个项目在给定价格下的商店数量。所以项目 A 在 50 家商店是 1.00,在 55 家商店是 2.00。

下面是执行 Fetch 的代码:

private IEnumerable<RetailPrice> FetchRetailPrices(IUnitOfWork unitOfWork, string upc)
{
    string StoredProcedure = "EXEC RetailPrices @UPC = :upc";
    List<Parameter> parameters = new List<Parameter>
    {
        new Parameter("upc", upc)
    };

    return unitOfWork.GetRepository<RetailPrice>().Fetch(
        StoredProcedure, parameters);
}

这是我尝试使用 Fluent NHibernate 映射的对象:

namespace Report.Entities
{
    [Serializable]
    public class Item
    {
        public virtual string Upc { get; protected internal set; }
        public virtual int ItemNumber { get; protected internal set; }
        public virtual string ItemDescription { get; protected internal set; }
    }
}

namespace Report.Entities
{
    [Serializable]
    public class RetailPrice
    {
        public virtual Item ItemDetails { get; protected internal set; }
        public virtual decimal Price { get; protected internal set; }
        public virtual int Count { get; protected internal set; }
    }
}

这是我的地图:

namespace Report.Mappings
{
    public class RetailPriceMap : ClassMap<RetailPrice>
    {
        public RetailPriceMap()
        {
            Id(a => a.Price).Column("Price");
            Map(a => a.Count).Column("Count");

            Component(a => a.ItemDetails, b =>
            {
                b.Map(c => c.ItemNumber).Column("ItemNumber");
                b.Map(c => c.ItemDescription).Column("ItemDescription");
                b.Map(c => c.Upc).Column("UPC");
            });
        }
    }
}

现在我只是以一个价格为一件商品做这件事,我得到了一个 PropertyNotFoundException:找不到 setter for 属性 'ItemNumber' in class 'Report.Entities.RetailPrice'.

为什么代码试图将其加载到 RetailPrice 对象而不是 Item 对象?它与 运行 作为 Fetch 查询的存储过程有什么关系吗?

一旦我解决了这个问题,我该如何着手制作 RetailPriceMap 上 ID 的 Item.Upc 部分?

您为零售价构建了一个具有完整映射的实体。 AliasToBean 转换器不使用映射,而是按照约定将列映射到属性。将转换器更改为 AddEntity:

public IEnumerable<TEntity> Fetch(String sql,IEnumerable<Parameter> parameters)
{
    return this.BuildQuery(sql, parameters).AddEntity(typeof(TEntity)).List<TEnti‌​ty>();
}