2009-11-10 54 views
1

我有一个遗留数据库,它使用guid将子项映射到父实体。通过辅助键映射Fluent Nhibernate中的字典

在我的领域层,我宁愿掩盖这一怪癖,所以我想有我父实体是这样的:

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映射到儿童在儿童字典中。 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:操作数类型冲突:这是使用类似映射的唯一标识符是与诠释

遗憾的是不兼容的,我似乎无法找出正确的方式告诉它加入ReferenceID字段。什么是正确的方式来做到这一点?我更喜欢字典,但如果我甚至可以让包工作,我会相当高兴。

为了清楚起见,我使用的是与从git中抽取的最近SharpArchitecture捆绑在一起的Fluent版本。 Fluent dll标记的版本是1.0.0.594,但如果更新的版本可以帮助,我很灵活。

回答

0

进一步挖掘导致我的袋子案的解决方案,虽然字典仍给我一点麻烦。

该解决方案需要修补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应该工作几乎相同的方式,但由于某些原因,我不是完全清楚,它不会为我工作。我会以后探索,但我愿意提供建议。