如何将NHibernateMap用于外键?
我有以下课程:如何将NHibernateMap用于外键?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有以下课程: public class Element { public Guid Id { get; set; } public ElementRouting route { get; set; } } public class ElementRouting { public Guid Id { get; set; } public Element ParentElement { get; set;}
public class Element
{
public Guid Id { get; set; }
public ElementRouting route { get; set; }
}
public class ElementRouting
{
public Guid Id { get; set; }
public Element ParentElement { get; set;}
public Element ChildElement { get; set; }
}
可以将一个元素路由到类似父子关系的另一个元素,该关系由以下类表示:
public class Element
{
public Guid Id { get; set; }
public ElementRouting route { get; set; }
}
public class ElementRouting
{
public Guid Id { get; set; }
public Element ParentElement { get; set;}
public Element ChildElement { get; set; }
}
元素的NHibernateMap如下所示:
public class ElementMapping : ClassMap<Element>
{
public ElementMapping()
{
Id(x => x.Id).GeneratedBy.Assigned();
Not.SelectBeforeUpdate();
References(x => x.Route).Column("ElementRoutingId").Nullable();
Table("Elements");
}
}
公共类元素映射:类映射
{
公共元素映射()
{
Id(x=>x.Id).GeneratedBy.Assigned();
不是。选择BeforeUpdate();
引用(x=>x.Route).Column(“ElementRoutingId”).Nullable();
表(“要素”);
}
}
…ElementRouting的地图如下所示:
public class ElementRoutingMapping : ClassMap<ElementRouting>
{
public ElementRoutingMapping()
{
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.ChildElement).Column("ElementId").Nullable();
Map(x => x.ParentElement).Column("ElementId").Nullable();
Table("ElementRoutings");
}
}
公共类元素路由映射:类映射
{
公共元素路由映射()
{
Id(x=>x.Id).GeneratedBy.Assigned();
Map(x=>x.ChildElement).Column(“ElementId”).Nullable();
Map(x=>x.ParentElement).Column(“ElementId”).Nullable();
表(“要素路线”);
}
}
在Isession.Flush()
的时候,我有一个属性ElementRouting为null的元素对象。我得到一个HibernateException(执行批处理查询时发生异常),其中包含以下InnerException详细信息:
{“UPDATE语句与外键约束“FK54CBB3751C1EAB64”冲突。冲突发生在数据库“myDataBaseName”、表“dbo.ElementRoutings”、列“Id”中
有人能解释一下我做错了什么吗?对于元素映射对路线的引用,使用:
References(x => x.TonsRoute).Column("TonsRouteId").Nullable().Cascade.All();
这不会导致冲突。首先,我意识到路由映射的ChildElement和ParentElement属性映射应该是.Column(“ChildElementId”)和.Column(“ParentElementId”)分别是因为我们实际指定的是这个表中的列本身。另外,它们不应该为null,因为实际路由在元素映射上是可以为null的。