gpt4 book ai didi

c# - 流利的 nhibernate 多对多与以下多对多映射

转载 作者:行者123 更新时间:2023-11-30 17:11:12 25 4
gpt4 key购买 nike

我有一个多对多的层次结构,我只是想不出如何明智地解决映射问题。

我有一个实体事件。这个事件可以有很多事件。一个事件只不过是一个值对象,所以我创建了一个多对多的映射,它工作得很好。

现在出现了我无法弄清楚的一点......为事件选择的每个事件都可以有多个原因(这也是一个值对象)

下面是简化的数据模型(事件和原因都存储在 SystemValues 中,并将 Type 作为它们的鉴别器值): enter image description here

(表 IncidentEvent 中的 ID 是代理主键,以避免使用复合键造成麻烦)

我的映射如下(简化):事件:

public class IncidentMap : ClassMap<Incident> {

public IncidentMap() {
Table("Incident");
Id(x => x.ID).GeneratedBy.Identity();

HasManyToMany(x => x.Event)
.Table("IncidentEvent")
.ParentKeyColumn("IncidentID")
.ChildKeyColumn("EventID");
}
}

事件(从通用“SystemValueMap”映射的子类):

public class EventMap : SubclassMap<StoryWhere> {
public EventMap() {
DiscriminatorValue((int)SystemValue.Type.Event);
HasManyToMany(x => x.Incident)
.Table("IncidentEvent")
.ParentKeyColumn("IncidentID")
.ChildKeyColumn("EventID");

HasManyToMany(x => x.Cause)
.Table("IncidentEventCause")
.ParentKeyColumn("IncidentEventID")
.ChildKeyColumn("CauseID");
}
}

原因:

public class CauseMap : SubclassMap<Cause> { 
public CauseMap() { DiscriminatorValue((int)SystemValue.Type.Cause); }
}

如您所见,“事件”的映射一团糟,当然它不起作用。当插入完成时,我得到外键约束,因为 NHibernate 试图将 EventID 插入到表 IncidentEventCause 的列 IncidentEventID 中。我可能需要告诉 Nhibernate 如何改用 IncidentEventID。我需要让 Event 意识到它与事件的多对多关系以及它与 Cause 的跟随关系,但恐怕我不知道如何做。

希望有人能指出我正确的方向。

最佳答案

如果可能,您应该重构数据库架构并在表 IncidentEventCause 中将 IncidentEventId 与 EventId 交换。

您想要的映射并不容易实现。这是持久性泄漏到域中的解决方法。

public class IncidentMap : ClassMap<Incident>
{
public IncidentMap()
{
Id(x => x.ID).GeneratedBy.Identity();

HasManyToMany(x => x.Events)
.Table("IncidentEvent")
.ParentKeyColumn("IncidentID")
.ChildKeyColumn("EventID")
.ChildWhere("type=" + (int)SystemValue.Type.Event);
}
}

public class Event
{
private EventDetails Details { get; set; }
public string Name { get { return Details.Name; } set { Details.Name = value; } }

}

class EventDetails : SystemValue
{
public virtual string Name { get; set; }
}

public class EventMap : ClassMap<Event>
{
public EventMap()
{
Table("IncidentEvent");

Id(x => x.Id, "Id").GeneratedBy.Identity();

References(x => x.Incident, "IncidentID");
References(Reveal.Member<Event>("Details"), "EventID").Not.LazyLoad();

HasManyToMany(x => x.Causes)
.Table("IncidentEventCause")
.ParentKeyColumn("IncidentEventID")
.ChildKeyColumn("CauseID");
}
}

public class EventDetailsMap : SubclassMap<EventDetails>
{
public EventDetailsMap()
{
DiscriminatorValue((int)SystemValue.Type.Event);
Map(x => x.Name);
}
}

public class CauseMap : SubclassMap<Cause>
{
public CauseMap()
{
DiscriminatorValue((int)SystemValue.Type.Cause);
Map(x => x.Name);
}
}

关于c# - 流利的 nhibernate 多对多与以下多对多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11518279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com