N Hibernate Session.Delete外键

时间:2014-07-09 05:47:15

标签: sql-server hibernate c#-4.0 nhibernate sql-delete

我的模型中有一个名为Wftask的模型,我有外键,这是地图

 Table("WfTask");
        Id(m => m.Id).Column("Id");
        Map(m => m.WfInstanceId);
        Map(m => m.OwnerGroupId);
        Map(m => m.Status);
        Map(m => m.DocId);
        Map(m => m.StepNo);
        Map(m => m.Comment).Length(500);
        Map(m => m.ActionDate);
        References(x => x.Action).Column("WfActionId").Cascade.All();
        References(x => x.WfState).Column("WfStateId").Cascade.All();
        References(x => x.WfTaskDetail).Column("WfTaskDetailId").Cascade.All();
        References(x => x.Owner).Column("OwnerId").ForeignKey("FK_Person_WfTask_OwnerId").Cascade.All();
        References(x => x.Actor).Column("ActorId").ForeignKey("FK_Person_WfTask_ActorId").Cascade.All();
        Map(m => m.ViewState);
        Map(m => m.Deleted);
        Map(m => m.Flag);
        References(x => x.WfVersionId).Column("WfVersionId").Cascade.All();
      //  HasManyToMany(x => x.PosibleActions).Table("WfPosibleActions").ChildKeyColumn("WfActionId").ParentKeyColumn("WftaskId");
        HasManyToMany(x => x.PosibleActions).Cascade.All().Table("WfPosibleActions").ChildKeyColumn("WfActionId").ParentKeyColumn("WftaskId");
    }

问题是当我想删除wftask对象时,Nhibernate删除WfActionId这是表WfActions和其他外键中的主键,同样如何将我的地图更改为仅删除wftask和wfposibleactiontable

1 个答案:

答案 0 :(得分:1)

您在many-to-one关系上使用级联,映射为

References(x => x.Action)
  .Column("WfActionId")
  .Cascade.All(); // that means, issue delete on current deletion

但是那种类型的引用(除非实际上在one-to-one中)不应该是.Cascade.All()。确实可能有其他项(兄弟wftasks)引用相同的行/标识符

要解决您的问题,请使用此级联:

.Cascade.SaveUpdate();

应该按照您的期望(在AddUpdate期间执行 - 除了删除。这应该是separtely,明确地......不是通过映射