我已经筋疲力尽了谷歌并且还没有想出如何完成我的数据模型的映射。更重要的是,我还没有找到一个很好的方法来模拟域名。
这是我的数据:
CREATE TABLE Ticket (
Id int IDENTITY(1,1) NOT NULL,
Name nvarchar(250) NULL
-- And a lot of other columns
)
现在每张票可以有任意数量的相关票证,但关键是这种关系是同伴关系,而不是父子关系。这是关联表:
CREATE TABLE TicketRelationship (
TicketA_Id int NOT NULL,
TicketB_Id int NOT NULL,
Description nvarchar(max) NULL
)
这里的想法是,在查看带有其他相关票证的票证时,我不仅可以查看相关票证,还可以查看该关系的描述。而且我将能够看到我是在看票A还是票B。
问题是如何1)在我的域中对此进行建模,不会为每个双向关系创建两个TicketRelationship
记录,以及2)如何使用NHibernate映射该域模型(我正在使用流利的NH)。
理想情况下,这是票类的工作方式:
public class Ticket : EntityBase<Ticket>, IAggregateRoot
{
public virtual string Name { get; set; }
public virtual IDictionary<Ticket, string> RelatedTickets { get; set; }
}
IDictionary
中的字符串是关系表中的Description
列。
现在的挑战是如何对此进行映射,以使相关的故障单显示在列表中,无论它是在TicketA_Id
还是TicketB_id
列中引用。
如果无法做到这一点,那么我可以拆分域模型,使类看起来像这样:
public class Ticket : EntityBase<Ticket>, IAggregateRoot
{
public virtual string Name { get; set; }
public virtual IDictionary<Ticket, string> ReferencesTickets { get; set; }
public virtual IDictionary<Ticket, string> ReferencedByTickets { get; set; }
}
这可能会简化一些事情,但是使用单个关联表我无法使映射工作。我尝试过这个,但FNH不允许我指定父键和子键:
mapping.HasMany(x => x.ReferencesTickets)
.Table("TicketRelationships")
.AsEntityMap()
.KeyColumn("TicketA_Id")
.Element("Description");
mapping.HasMany(x => x.ReferencedByTickets)
.Table("TicketRelationships")
.AsEntityMap()
.KeyColumn("TicketB_Id")
.Element("Description");
任何想法如何使我的工作?
我能够通过调整映射来使后备方案工作:
mapping.HasMany(x => x.ReferencesTickets)
.Table("TicketRelationships")
.AsEntityMap("TicketB_Id")
.KeyColumn("TicketA_Id")
.Element("Description");
mapping.HasMany(x => x.ReferencedByTickets)
.Table("TicketRelationships")
.AsEntityMap("TicketA_Id")
.KeyColumn("TicketB_Id")
.Element("Description");
但是,如果有办法让一个IDictionary
来简化它,我很乐意听到任何建议。