我正在开发一个错误跟踪应用程序。有门票,每张门票都有一个开启者用户和一个指定用户。所以,基本上,我有两个实体,它们之间有两个多对一的关系。他们的示意图是这样的:
用户:
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:
在 Steves 的帮助下,我发现我必须实现自己的 IHasManyConvention。我还发现 IHasManyConvention 中生成的列名必须与我的 IReferenceConvention 生成的列名匹配。稍微调整一下,我就让它工作了。
我还震惊地发现,调用方便的 ForeignKey.EndsWith("Id")
方法会把整个事情搞砸。
虽然 Steves 的回答本身并不能解决问题,但我非常感谢他为我指明了正确的方向。
最佳答案
自动映射为其外键列生成相同的名称。您可以通过使用(映射的)属性名称命名外键列的自定义约定来克服此问题:
class HasManyConvention : IHasManyConvention
{
public void Apply(IOneToManyCollectionInstance instance)
{
instance.Key.Column(instance.Member.Name);
}
}
// register convention using:
autoMapping.Conventions.Add(new HasManyConvention());
关于.net - 流利的 NHibernate : multiple one-to-many relationships between the same entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777152/