FluentNhibernate IDictionary< Entity,ValueObject> [英] FluentNhibernate IDictionary<Entity,ValueObject>
问题描述
我有一个 IDictionary< StocksLocation,decimal>
属性的映射,这是映射:
HasMany< StocksLocation>(mq => mq.StocksLocation)
.KeyColumn(IDProduct)
.AsEntityMap(IDLocation)
.Element (Quantity,qt => qt.Type< decimal>());
现在我从 decimal
更改为一个值对象: Quantity
。
Quantity有两个属性,小数值
和单位
单位(其中单位
是一个枚举)。
$ b
我现在必须映射 IDictionary< StocksLocation,Quantity>
,我该如何实现这个功能? p>
提前致谢 解决方案
选项1:将其映射为实体
我猜你的表看起来类似于这个:
pre $ CREATE TABLE Quantity(
ID int NOT NULL,
IDProduct int NOT NULL,
IDLocation int NOT NULL,
十进制数(18,2)NOT NULL,
单位int NOT NULL,
PRIMARY KEY(ID),
FOREIGN KEY(IDProduct)REFERENCES Product(ID),
FOREIGN KEY(IDLocation)REFERENCES StocksLocation(ID),
UNIQUE KEY (IDProduct,IDLocation)
);
继续并将 Quantity
映射为一个实体class:
public class QuantityMap:ClassMap< Quantity>
类,为任何不能用FluentNHibernate映射的类编写一个* .hbm.xml文件。 li>
{
public QuantityMap()
{
Id(x => x.Id);
参考文献(x => x.Product,IDProduct);
引用(x => x.Location,IDLocation);
Map(x => x.Value);
Map(x => x.Unit);
$ / code $ / pre
...然后更改<$ c $
HasMany< StocksLocation,Quantity>(mq => mq.StocksLocation)
.KeyColumn(IDProduct)
.AsMap(x => x.Location);
选项2:将其映射为组件
因为你评论说你不想将
Quantity
映射为一个实体,所以让我们考虑如何将它作为一个组件映射。Product.StocksLocation
字典的* .hbm.xml映射如下所示:
< map name =StocksLocationtable =Quantity>
< key column =IDProduct/>
< composite-element class =YourNamespace.Quantity,YourAssembly>
< property name =Unittype =YourNamespace.Unit,YourAssembly/>
< property name =Valuetype =System.Decimal,mscorlib/>
< / composite-element>
< / map>
我们如何使用FluentNHibernate来做到这一点?据我所知,在干线上没有这样做的方法,所以你有几个选择:
- Gabriel Schenker 实现了一个
HasManyComponent
方法。他有一个链接到他的项目的源代码,但我不知道这个来源是否包括他对FluentNHibernate的变化。
- 如果他的更改的来源不可用,随时可以实现自己对FluentNHibernate的修改,并通过Github将它们提交给社区。
- 如果这听起来像是太麻烦了,那么FluentNHibernate在所有其他的失败时都会有最终的回退。它允许你混合和匹配各种映射方法。自动映射一些类,为其他类写
ClassMap
I had a mapping for a
IDictionary<StocksLocation,decimal>
property, this was the mapping:HasMany<StocksLocation>(mq => mq.StocksLocation) .KeyColumn("IDProduct") .AsEntityMap("IDLocation") .Element("Quantity", qt => qt.Type<decimal>());
Now i changed from
decimal
to a Value Object:Quantity
.
Quantity
has two properties, decimalValue
andUnit
Unit (whereUnit
is an enum).I now have to map
IDictionary<StocksLocation,Quantity>
, how can i achieve this?Thanks in advance
解决方案Option 1: Map it as an Entity
I'm guessing that your table looks similar to this:
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) );
Go ahead and map
Quantity
as an entity class: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); } }
... and then change the
Product.StocksLocation
mapping to:HasMany<StocksLocation, Quantity>(mq => mq.StocksLocation) .KeyColumn("IDProduct") .AsMap(x => x.Location);
Option 2: Map it as a Component
Because you commented that you'd rather not map
Quantity
as an entity, let's consider how we would map this as a component instead. The *.hbm.xml mapping for theProduct.StocksLocation
dictionary would look like this:<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>
How do we do this with FluentNHibernate? As far as I know, there isn't a method for doing this in the trunk, so you have a few options:
- Gabriel Schenker implemented a
HasManyComponent
method. He has a link to the source code for his project, but I don't know whether that source includes the changes he made to FluentNHibernate.- If the source for his changes are not available, feel free to implement your own modifications to FluentNHibernate and submit them back to the community via Github.
- If that sounds like too much trouble, FluentNHibernate has an ultimate fallback when all else fails. It allows you to mix and match various mapping methods. Auto-map some of your classes, write
ClassMap
classes for others, and write a *.hbm.xml file for any classes that can't be mapped with FluentNHibernate.
这篇关于FluentNhibernate IDictionary< Entity,ValueObject>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!