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, decimal Value
and Unit
Unit (where Unit
is an enum).
I now have to map IDictionary<StocksLocation,Quantity>
, how can i achieve this?
Thanks in advance
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);
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 the Product.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:
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.ClassMap
classes for others, and write a *.hbm.xml file for any classes that can't be mapped with FluentNHibernate.