2013-05-14 57 views
0
public class ReviewMap : ClassMapBase<Review> 
    { 
     public ReviewMap() 
     { 
      Table("Reviews"); 

      List(x => x.Objectives, m => 
      { 
       m.Table("Objectives"); 
       m.Cascade(Cascade.All.Include(Cascade.DeleteOrphans)); 
       m.Key(k => k.Column("ReviewId")); 
       m.Where("DeletionDate is null"); 
       m.OrderBy("OrderNo"); 
       m.Index(x => x.Column("OrderNo")); 
       m.Inverse(true); 
      }, m => m.OneToMany()); 
     } 


public class ObjectiveMap : ClassMapBase<Objective> 
    { 
     public ObjectiveMap() 
     { 
      Table("Objectives"); 

      // Use "soft deletes" to allow us to capture results against deleted items 
      Where("DeletionDate is null"); 
      SqlDelete("update Objectives set DeletionDate = getutcdate(), OrderNo = 1 where id=?"); 

      ManyToOne(x => x.Review, m => 
      { 
       m.Column("ReviewId"); 
       m.NotNullable(true); 
      }); 

      Property(x => x.Details, m => 
      { 
       m.NotNullable(true); 
       m.Length(1000); 
       m.Column("Details"); 
      }); 

      Property("OrderNo", m => 
      { 
       m.NotNullable(false); 
      }); 

     } 
    } 

当我尝试删除评论,然后它给我在目标表中的外键约束的错误。因为ReviewId是Objectives表中的外键。无法删除Nhibernate映射中的外键约束

你能提出什么问题吗?

回答

1

您可以使用自定义的sql-delete来防止在Objectives表中删除,但同时也要求所有Objective都有对Review行的引用。这项工作应该如何?这也需要评论从不删除。

这可以工作的方式是,如果你删除Objectives.ReviewId列的外键约束,但我不会建议。由于删除的Review行的ID对于历史目的来说不会有帮助,所以更好的方法是将Objectives.ReviewId列设为空,并在您的自定义sql删除中将其删除。

+0

好的非常感谢。我将讨论我们的需求需要什么类型的方法。我真的很感谢你的帮助:-)谢谢你 – Moiz 2013-05-14 08:27:38

+0

即使我改变了sqldelete(update更改为ReviewId = null,但它仍然给我出现同样的错误 – Moiz 2013-05-14 08:43:08

+0

@Moiz你应该检查NHibernate执行的NHibernate的NHibernate语句日志记录或SQL/NHibernate分析器。 – cremor 2013-05-14 09:02:50