- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多对多的层次结构,我只是想不出如何明智地解决映射问题。
我有一个实体事件。这个事件可以有很多事件。一个事件只不过是一个值对象,所以我创建了一个多对多的映射,它工作得很好。
现在出现了我无法弄清楚的一点......为事件选择的每个事件都可以有多个原因(这也是一个值对象)
下面是简化的数据模型(事件和原因都存储在 SystemValues 中,并将 Type 作为它们的鉴别器值):
(表 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/
我正在尝试将fluentd与elasticsearch连接起来,并且在启动td-agent服务时遇到此错误。 td-agent.log: 无法与Elasticsearch通信,重置连接并重试。连接被拒
所以我有一个案例,布局已经变得更加复杂。有一些常见的东西,比如 @section styleIncludes{ ... } ,然后是其他部分,这些部分定义了每个页面可以选择(但几乎总是)指定的各种内容
我刚刚看到一个巨大的 Java 正则表达式,它让我对一般正则表达式的可维护性有所思考。我相信大多数人——除了一些糟糕的 perl 贩子——都会同意正则表达式很难维护。 我在考虑如何解决这种情况。到目前
我有一个 12 秒长的 audio.mp3 文件video.mp4 的长度为 60 秒。 我需要在视频的第 40 秒插入audio.mp3。 如何使用 Node-Fluent-ffmpeg 做到这一点
我正在使用 NHibernate + Fluent 来处理我的应用程序中的数据库。到目前为止,我一直在使用 SessionSource 来创建我的 ISession 对象。我现在对来自 NHibern
我在 Java 控制台应用程序中使用 Apache HttpClient 4.5(具有流畅的界面)。我注意到,它的默认超时值似乎是无限的,但我必须为我发送的请求使用非无限的超时值。我想对所有请求使用相
这是我的路线: router.get("answers","delete", Int.parameter) { req -> Future in let answerID = try
我有随机“ session 已关闭!” Autofac 和 Fluent nHibernate 的以下配置错误: 全局.asax.cs: builder.Register(x => new NHibe
我是一名优秀的程序员,十分优秀!