.net - 流利的 NHibernate : multiple one-to-many relationships between the same entities

标签 .net asp.net nhibernate fluent-nhibernate nhibernate-mapping

我正在开发一个错误跟踪应用程序。有门票,每张门票都有一个开启者用户和一个指定用户。所以,基本上,我有两个实体,它们之间有两个多对一的关系。他们的示意图是这样的:

用户:

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/

相关文章:

c# - .Net 的 Blackmagic Decklink 接口(interface)

asp.net - ASP.NET MVC3 应用程序中的简单 DropDownList

javascript - 尝试显示 Web api 服务数据时出现空白页面

c# - 取消正在运行的进程

nhibernate - 将 NHibernate 实体映射到基于父级的多个表

c# - WPF 自定义控件在 View 模型子属性更改时重新呈现

c# - 如何读取我的网络服务中的 .p12 文件

c# - 如何将带有状态变量的 C# Linq 查询重写为 T-SQL

c# - 如何与中间的链接表建立多对一关系?

c# - 无法找到 Net Core NHibernate System.Data.SQLite