FluentNhibernate IDictionary <entity,valueobject> </entity,valueobject>

时间:2010-03-11 10:32:31

标签: nhibernate fluent-nhibernate

我有一个IDictionary<StocksLocation,decimal>属性的映射,这是映射:

    HasMany<StocksLocation>(mq => mq.StocksLocation)
        .KeyColumn("IDProduct")
        .AsEntityMap("IDLocation")
        .Element("Quantity",  qt => qt.Type<decimal>()); 

现在我从decimal更改为值对象:Quantity

Quantity有两个属性,十进制ValueUnit单位(其中Unit是一个枚举)。

我现在必须映射IDictionary<StocksLocation,Quantity>,我怎样才能实现这个目标?

提前致谢

1 个答案:

答案 0 :(得分:2)

选项1:将其映射为实体

我猜你的桌子看起来很像这样:

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); 

选项2:将其映射为组件

因为您评论说您不想将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执行此操作?据我所知,在主干中没有这样做的方法,所以你有几个选择:

  1. Gabriel Schenker实施了HasManyComponent方法。他有一个链接到他的项目的源代码,但我不知道该源是否包括他对FluentNHibernate所做的更改。
  2. 如果他的更改源不可用,请随意对FluentNHibernate实施自己的修改,并通过Github将其提交回社区。
  3. 如果这听起来太麻烦,当其他所有方法都失败时,FluentNHibernate会有一个最终的后退。它允许您混合和匹配各种映射方法。自动映射一些类,为其他类编写ClassMap类,并为无法使用FluentNHibernate映射的任何类编写* .hbm.xml文件。