我有一个IDictionary<StocksLocation,decimal>
属性的映射,这是映射:
HasMany<StocksLocation>(mq => mq.StocksLocation)
.KeyColumn("IDProduct")
.AsEntityMap("IDLocation")
.Element("Quantity", qt => qt.Type<decimal>());
现在我从decimal
更改为值对象:Quantity
。
Quantity
有两个属性,十进制Value
和Unit
单位(其中Unit
是一个枚举)。
我现在必须映射IDictionary<StocksLocation,Quantity>
,我怎样才能实现这个目标?
提前致谢
答案 0 :(得分:2)
我猜你的桌子看起来很像这样:
CREATE TABLE Quantity (
ID int NOT NULL,
IDProduct int NOT NULL,
IDLocation int NOT NULL,
Value decimal(18,2) NOT NULL,
Unit int NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (IDProduct) REFERENCES Product (ID),
FOREIGN KEY (IDLocation) REFERENCES StocksLocation (ID),
UNIQUE KEY (IDProduct, IDLocation)
);
继续并将Quantity
映射为实体类:
public class QuantityMap : ClassMap<Quantity>
{
public QuantityMap()
{
Id(x => x.Id);
References(x => x.Product, "IDProduct");
References(x => x.Location, "IDLocation");
Map(x => x.Value);
Map(x => x.Unit);
}
}
...然后将Product.StocksLocation
映射更改为:
HasMany<StocksLocation, Quantity>(mq => mq.StocksLocation)
.KeyColumn("IDProduct")
.AsMap(x => x.Location);
因为您评论说您不想将Quantity
映射为实体,所以让我们考虑如何将此映射为组件。 Product.StocksLocation
字典的* .hbm.xml映射如下所示:
<map name="StocksLocation" table="Quantity">
<key column="IDProduct" />
<index-many-to-many column="IDLocation" class="YourNamespace.StocksLocation, YourAssembly" />
<composite-element class="YourNamespace.Quantity, YourAssembly">
<property name="Unit" type="YourNamespace.Unit, YourAssembly" />
<property name="Value" type="System.Decimal, mscorlib" />
</composite-element>
</map>
我们如何使用FluentNHibernate执行此操作?据我所知,在主干中没有这样做的方法,所以你有几个选择:
HasManyComponent
方法。他有一个链接到他的项目的源代码,但我不知道该源是否包括他对FluentNHibernate所做的更改。ClassMap
类,并为无法使用FluentNHibernate映射的任何类编写* .hbm.xml文件。