【问题标题】:Mapping a dictionary in Fluent Nhibernate through a secondary key通过辅助键在 Fluent Nhibernate 中映射字典
【发布时间】:2013-07-31 17:00:49
【问题描述】:

我有一个遗留数据库,它使用 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 语义,将 Parent 的 IDictionary 替换为 IList。这是使用类似的东西映射的:

  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,但如果更新的版本会有所帮助,我很灵活。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

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

    该解决方案需要 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 应该以几乎相同的方式工作,但由于某些我并不完全清楚的原因,它对我不起作用。我稍后会探讨,但我愿意接受建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多