我正在开发一个错误跟踪应用程序。有票证,每张票证都有一个开场用户和一个分配的用户。所以,基本上,我有两个实体,它们之间有两个多对一的关系。他们的原理图如下:
用户:
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无法分辨出哪个关系属于哪个。
我用Google搜索,但没有找到任何有用的东西。
编辑2:
在Steves的帮助下,我必须实施自己的IHasManyConvention。我还发现IHasManyConvention中生成的列名必须与我的IReferenceConvention生成的列名相匹配。随着一个小小的调整,我得到了它的工作。
我还惊讶地发现,调用方便的ForeignKey.EndsWith("Id")
方法会弄乱整个事情。
虽然史蒂夫斯的答案本身并没有解决问题,但我非常感谢他指出了我正确的方向。
答案 0 :(得分:2)
自动映射为其外键列生成相同的名称。您可以使用通过(映射)属性名称命名外键列的自定义约定来解决此问题:
class HasManyConvention : IHasManyConvention
{
public void Apply(IOneToManyCollectionInstance instance)
{
instance.Key.Column(instance.Member.Name);
}
}
// register convention using:
autoMapping.Conventions.Add(new HasManyConvention());