通过辅助键在Fluent Nhibernate中映射词典

通过辅助键在Fluent Nhibernate中映射词典,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个遗留数据库,它使用guid将子对象映射到父实体 在我的域层中,我更喜欢掩盖这一怪癖,因此我希望我的父实体如下所示: public class Parent { virtual public int Id {get; protected set; } virtual public string ParentContent { get; set; } virtual public Guid ReferenceId { get; set; } virtual p

我有一个遗留数据库,它使用guid将子对象映射到父实体

在我的域层中,我更喜欢掩盖这一怪癖,因此我希望我的父实体如下所示:

public class Parent
{
    virtual public int Id {get; protected set; }
    virtual public string ParentContent { get; set; }
    virtual public Guid ReferenceId { get; set; }
    virtual public IDictionary<int,Child> Children { get; set; }
}

public class Child
{
    virtual public int Id { get; protected set; }
    virtual public Parent { get; set; }
    virtual public string ChildContent { get; set; }
}
        mapping.HasMany<Broker>(x => x.Children)
            .Table("Child")
            .KeyColumn("ParentReferenceID")
            .Inverse()
            .AsMap<long>(index=>index.Id,val=>val.Type<Broker>());
然后,父级会将每个Child.Id映射到childrendictionary中的Child。子映射工作正常,但我似乎无法为父映射找到合理的映射

父表和子表中都存在一个名为ParentReferenceID的字段,因此我尝试将其映射为如下内容:

public class Parent
{
    virtual public int Id {get; protected set; }
    virtual public string ParentContent { get; set; }
    virtual public Guid ReferenceId { get; set; }
    virtual public IDictionary<int,Child> Children { get; set; }
}

public class Child
{
    virtual public int Id { get; protected set; }
    virtual public Parent { get; set; }
    virtual public string ChildContent { get; set; }
}
        mapping.HasMany<Broker>(x => x.Children)
            .Table("Child")
            .KeyColumn("ParentReferenceID")
            .Inverse()
            .AsMap<long>(index=>index.Id,val=>val.Type<Broker>());
不幸的是,这会产生一个错误: 类型或方法有2个泛型参数,但提供了1个泛型参数。必须为每个泛型参数提供泛型参数

为了简化我的问题,我从尝试包语义开始,用IList替换父级的IDictionary。这是使用以下方式映射的:

  mapping.HasMany<Broker>(x => x.Brokers)
     .Table("Child")
     .KeyColumn("ParentReferenceId")
     .Inverse()
     .AsBag();
这就产生了一个更明显的例外, System.Data.SqlClient.SqlException:操作数类型冲突:uniqueidentifier与int不兼容

不幸的是,我似乎无法找到正确的方法来告诉它加入ReferenceID字段。正确的方法是什么?我更喜欢这本字典,但如果我能把这本书包用起来,我会相当高兴的


为了清楚起见,我使用的是一个Fluent构建,它与最近从git推出的SharpArchitecture捆绑在一起。Fluent dll标记为1.0.0.594版,但如果最近的版本有帮助,我会灵活处理。

进一步挖掘使我找到了解决Bag问题的方法,尽管字典仍然给我带来了一些麻烦

该解决方案需要一个到Fluent NHibernate的OneToManyPart映射类的补丁。帽子尖到

理论上,AsMap应该以几乎相同的方式工作,但由于某种原因,我不完全清楚,它对我不起作用。稍后我将对此进行探讨,但我愿意接受建议