流畅的NHibernate组件映射问题

时间:2015-01-16 16:29:11

标签: c# nhibernate fluent-nhibernate fluent fluent-nhibernate-mapping

我有一个SQL Server存储过程,我正在使用查询字符串执行,该字符串返回一个表,其中包含以下列(ItemNumber,ItemDescription,UPC,Price,Count),表示Item对于给定的商店的数量价钱。所以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:无法在“Report.Entities.RetailPrice”类中找到属性“ItemNumber”的setter。

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

一旦我解决了问题,我怎样才能在RetailPriceMap上制作Id的Item.Upc部分?

1 个答案:

答案 0 :(得分:0)

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

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