FluentNhibernate IDictionary< Entity,ValueObject> [英] FluentNhibernate IDictionary<Entity,ValueObject>

查看:110
本文介绍了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> 
{
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来做到这一点?据我所知,在干线上没有这样做的方法,所以你有几个选择:


  1. Gabriel Schenker 实现了一个 HasManyComponent 方法。他有一个链接到他的项目的源代码,但我不知道这个来源是否包括他对FluentNHibernate的变化。

  2. 如果他的更改的来源不可用,随时可以实现自己对FluentNHibernate的修改,并通过Github将它们提交给社区。
  3. 如果这听起来像是太麻烦了,那么FluentNHibernate在所有其他的失败时都会有最终的回退。它允许你混合和匹配各种映射方法。自动映射一些类,为其他类写 ClassMap 类,为任何不能用FluentNHibernate映射的类编写一个* .hbm.xml文件。 li>


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

解决方案

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 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:

  1. 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.
  2. 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.
  3. 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&lt; Entity,ValueObject&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆