如何将NHibernateMaps用于外键?

时间:2009-11-02 06:26:26

标签: 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 Element ChildElement { get; set; }
    }

我的NHibernateMap for Element看起来像这样:

public class ElementMapping : ClassMap<Element>
{
    public ElementMapping()
    {
        Id(x => x.Id).GeneratedBy.Assigned();
        Not.SelectBeforeUpdate();
        References(x => x.Route).Column("ElementRoutingId").Nullable();

        Table("Elements");
    }
}

...而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");
    }
}

在I session.Flush()处,我有一个Element对象,其属性为ElementRouting。我使用此InnerException详细信息获取HibernateException(执行批处理查询时发生异常):

{“UPDATE语句与FOREIGN KEY约束冲突”FK54CBB3751C1EAB64“。冲突发生在数据库”myDataBaseName“,表”dbo.ElementRoutings“,列'Id'。}

任何人都可以向我解释我做错了吗?

1 个答案:

答案 0 :(得分:2)

对于Element Mapping对路径的引用,使用:

References(x => x.TonsRoute).Column("TonsRouteId").Nullable().Cascade.All();

不会引起冲突。