3

我正在研究一个bug跟踪应用程序。有门票,每张门票都有开门人用户和分配的用户。所以,基本上,我有两个实体,它们之间有两个多对一的关系。其原理是这样的:FluentNHibernate:同一实体之间的多个一对多关系

用户:

public class User 
{ 
    public virtual int Id { get; protected set; } 
    ... 

    public virtual IList<Ticket> OpenedTickets { get; set; } 
    public virtual IList<Ticket> AssignedTickets { get; set; } 
} 

票:

public class Ticket 
{ 
    public virtual int Id { get; protected set; } 
    ... 

    [Required] 
    public virtual User OpenerUser { get; set; } 
    public virtual User AssignedUser { get; set; } 
} 

我用FluentNHibernate的自动映射功能。

问题是,无论我设置的关系,在用户的侧面,两个集合总是包含相同的数据。我想Fluent无法判断哪个关系属于哪个末端。

我搜索了一下,但没有发现任何有用的东西。

编辑2:

我富尔德出与史蒂夫的帮助下,我要实现自己的IHasManyConvention。我还发现IHasManyConvention中生成的列名必须与我的IReferenceConvention生成的列名相匹配。随着小调整,我得到它的工作。

我还惊讶地发现,调用方便的ForeignKey.EndsWith("Id")方法弄乱了整个事情。

虽然史蒂夫的回答本身并不能解决问题,但我非常感谢他指出我正确的方向。

+0

你试过检查NHibernate在底层做了什么吗?我的意思是生成的数据库模式如何以及在测试期间运行了哪些SQL查询。 – Steves 2010-05-06 14:35:05

+0

是的,我做到了。它会产生完全无关的列。 – Venemo 2010-05-06 15:15:53

+0

好的,我终于设法解决了它。更新了我的帖子,并非常感谢您指引我朝着正确的方向发展。 – Venemo 2010-05-06 15:26:13

回答

2

自动映射为其外键列生成相同的名称。你可以通过自定义约定来解决这个问题,通过(映射的)属性名称来命名外键列:

class HasManyConvention : IHasManyConvention 
{ 
    public void Apply(IOneToManyCollectionInstance instance) 
    { 
     instance.Key.Column(instance.Member.Name); 
    } 
} 

// register convention using: 
autoMapping.Conventions.Add(new HasManyConvention()); 
相关问题