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

时间:2009-11-10 02:43:17

标签: 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 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; }
}

然后,父级会将每个Child.Id映射到Children字典中的Child。子映射工作正常,但我似乎无法为父级找到合理的映射。

父表和子表中都存在名为ParentReferenceID的字段,因此我尝试使用以下内容映射:

        mapping.HasMany<Broker>(x => x.Children)
            .Table("Child")
            .KeyColumn("ParentReferenceID")
            .Inverse()
            .AsMap<long>(index=>index.Id,val=>val.Type<Broker>());

不幸的是,这会产生错误: 类型或方法有2个通用参数,但提供了1个通用参数。必须为每个通用参数提供通用参数。

为了简化我的问题,我开始尝试使用Bag语义,用IList替换Parent的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,但如果更新的版本有帮助,我就很灵活。

1 个答案:

答案 0 :(得分:0)

进一步的挖掘让我找到了Bag案例的解决方案,虽然字典仍然给我带来了一些麻烦。

该解决方案需要Fluent NHibernate的OneToManyPart映射类的补丁。 (帽子提示到This bug report: Could not map a one-to-many relationship where the key is not the primary key

   mapping.HasMany(x => x.Children)
       .Table("Child").KeyColumn("ParentReferenceId")
       .PropertyRef("ReferenceId")
       .Inverse()
       .AsBag();

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