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<TEntity>();
}
我有一个 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<TEntity>();
}