如何使用FluentMap进行一对多映射?

时间:2019-06-13 15:53:10

标签: c# dapper dapper-fluentmap

我刚刚开始使用FluentMap,并且希望将同一列映射到2个属性,因为它们需要相同的值。这是我的地图:

internal class DefaultsMap : EntityMap<Defaults>
{
    internal DefaultsMap()
    {
        Map(d => d.HistoricalValues.Cost).ToColumn("defaultValue");
        Map(d => d.FutureValues.Cost).ToColumn("defaultValue");
        //other mappings...
    }
}

这将引发以下错误:

Exception: Duplicate mapping detected. Property 'Cost' is already mapped to column 'Cost'.

所以看来我无法将同一列映射到2个不同的属性,或者这是因为属性本​​身称为同一件事(成本)?

2 个答案:

答案 0 :(得分:1)

不搭配精致的衣服;我在NHibernate中遇到了这个问题。

我不确定这一点,但可能是映射器工具以键值之类的数据结构形式存储您的映射。

也就是说,您不能存储两个具有相同名称的不同密钥。

即使这不是真的,很明显,映射器也必须需要不同的命名来识别映射是不同的。它不会查看为其定义属性的类;它只是查看属性名称。

您可以考虑重命名属性,以明确命名它们,如下所示:

HistoricalValues.Cost => HistoricalValues.HistoricalCost
FutureValues.Cost => FutureValues.FutureCost

答案 1 :(得分:0)

根据阿米特·乔希(Amit Joshi)的回答,由于映射器必须具有不同的命名,因此以当前的形式看来这不可能。不幸的是,由于查询要从通用表返回所有值以创建Defaults对象列表,因此我无法仅为其中之一重命名该列。

作为一种解决方法,在这种情况下,我可以通过为其中一个分配属性,为另一个分配给“成本”属性的“值”属性来实现我想要的:

Map(d => d.HistoricalValues.Cost).ToColumn("defaultValue");
Map(d => d.FutureValues.Cost.Value).ToColumn("defaultValue");