使用流畅的nhibernate </string,>自动映射IDictionary <string,myclass =“”>

时间:2009-12-09 17:22:31

标签: c# fluent-nhibernate

我有一个看起来像这样的简单类:

public class Item {
 // some properties
public virtual IDictionary<string, Detail> Details { get; private set; }
}

然后我有一张如下所示的地图:

map.HasMany(x => x.Details).AsMap<string>("Name").AsIndexedCollection<string>("Name", c => c.GetIndexMapping()).Cascade.All().KeyColumn("Item_Id"))

使用此地图我收到以下错误,我不知道如何解决它?

类型或方法有2个通用参数,但提供了1个通用参数。必须为每个通用参数提供通用参数。

1 个答案:

答案 0 :(得分:1)

我找到了解决方法。基本上我阻止了自动播放器尝试映射IDictionary。它迫使我必须在覆盖中手动映射,但至少它可以工作。

我正在使用从DefaultAutomappingConfiguration派生的AutomappingConfiguration。

public override bool ShouldMap(Member member)
{
    if ( member.PropertyType.IsGenericType )
    {
        if (member.PropertyType.GetGenericTypeDefinition() == typeof(System.Collections.Generic.IDictionary<,>))
                    return false;
    }

    return base.ShouldMap(member);
}

这里有几个示例类以及我用来实现这一目标的相关映射:

public class ComponentA
{
    public virtual string Name { get; set; }
}

public class EntityF : Entity
{
    private IDictionary<string, ComponentA> _components = new Dictionary<string, ComponentA>();
    public IDictionary<string, ComponentA> Components
    {
        get { return _components; }
        set { _components = value; }
    }
}

public class EntityFMap : IAutoMappingOverride<EntityF>
{
    public void Override(AutoMapping<EntityF> mapping)
    {
        mapping.HasMany<ComponentA>(x => x.Components)
            .AsMap<string>("IndexKey")
            .KeyColumn("EntityF_Id")
            .Table("EntityF_Components")
            .Component(x =>
                           {
                               x.Map(c => c.Name);
                           })
            .Cascade.AllDeleteOrphan();
    }
}

我刚刚花了几个小时才完成这项工作,所以我希望这可以节省其他人一个晚上的拉头。