📜  NHibernate-级联

📅  最后修改于: 2020-11-19 05:39:12             🧑  作者: Mango


在本章中,我们将介绍如何使用Cascade功能。如果您有一组商品或一组商品,或者两个类别(例如我们的客户和订单)之间存在关系,并且具有外键关系。如果默认情况下删除客户,则NHibernate不会对子对象执行任何操作,因此属于该客户的对象可能会孤立订单。

  • 我们也可能违反外键约束,因此我们可以使用级联的概念。

  • 默认情况下,NHibernate不会将操作级联到子对象。

  • 这样做的原因是,您可以拥有诸如具有默认送货地址的客户之类的关系,并且送货地址与许多不同的客户共享。

  • 因此,您不必一定要级联这种关系,因为其他客户仍在引用它。

  • 因此,级联的整个概念是告诉NHibernate如何处理其子实体。

级联有不同的选项,如下所示-

  • none-这是默认设置,表示不进行级联。

  • 全部-将要级联保存,更新和删除。

  • save-update-将层叠,保存和更新。

  • delete-它将级联删除。

  • all-delete-orphan-这是一种非常常用的特殊字符,与All Except相同,如果它找到Delete-orphan行,它也会将其删除。

您可以在hbm.xml文件中指定默认值,因此可以在该Hibernate映射元素上提供默认级联,也可以为特定的集合和关系(例如多对一)指定默认值。

让我们看一下简单的示例级联,让我们解决程序中的问题,我们必须手动将保存级联到订单,如以下代码所示。

using(var session = sessionFactory.OpenSession()) 

using(var tx = session.BeginTransaction()) { 
   var newCustomer = CreateCustomer(); 
   Console.WriteLine("New Customer:"); 
   Console.WriteLine(newCustomer); 
   session.Save(newCustomer); 
    
   foreach (var order in newCustomer.Orders) { 
      session.Save(order); 
   } 
    
   id = newCustomer.Id; 
   tx.Commit(); 
}

在上面的代码片段中,您可以看到我们正在为客户手动保存所有订单。现在,让我们删除保存所有订单的手动级联代码。

using(var session = sessionFactory.OpenSession())
 
using(var tx = session.BeginTransaction()) { 
   var newCustomer = CreateCustomer(); 
   Console.WriteLine("New Customer:"); 
   Console.WriteLine(newCustomer);
    
   session.Save(newCustomer); 
   id = newCustomer.Id; 
   tx.Commit(); 
}

我们需要在customer.hbm.xml中指定层叠选项。

 
 
    
    
   
       
          
       
      
       
       
       
       
       
       
      
      
       
          
          
          
          
      
      
       
          
          
       
   
    

  • 现在,订单完全属于客户。因此,如果从数据库中删除了客户,则我们的此处应用程序将要删除所有这些订单,包括可能已经孤立的所有订单。

  • 最终将执行删除操作。这样,它将说从订单表中删除,其中客户ID等于您要删除的客户。

  • 因此,您实际上可以级联这些删除操作。因此,使用All ,它将进行保存,更新和删除。

现在,当您运行此应用程序时,将看到以下输出。

New Customer:
John Doe (00000000-0000-0000-0000-000000000000)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Unspecified)
   CreditRating: Good
   AverageRating: 42.42424242

   Orders:
      Order Id: 00000000-0000-0000-0000-000000000000
      Order Id: 00000000-0000-0000-0000-000000000000

Reloaded:
John Doe (10b2a3d7-7fcf-483c-b1da-a5bb00b8512e)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: e6680e30-5b3b-4efa-b017-a5bb00b85133
      Order Id: b03858e7-8c36-4555-8878-a5bb00b85134

The orders were ordered by:
John Doe (10b2a3d7-7fcf-483c-b1da-a5bb00b8512e)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: e6680e30-5b3b-4efa-b017-a5bb00b85133
      Order Id: b03858e7-8c36-4555-8878-a5bb00b85134

John Doe (10b2a3d7-7fcf-483c-b1da-a5bb00b8512e)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: e6680e30-5b3b-4efa-b017-a5bb00b85133
      Order Id: b03858e7-8c36-4555-8878-a5bb00b85134
        
Press  to exit...

如您所见,我们已经从手动级联的程序中删除了代码,我们的应用程序仍在工作。

因此,根据您的关系,您可能希望将其级联。现在,让我们看一下不同的级联关系。让我们转到Order.hbm.xml文件,我们可以级联这种多对一关系。

 
 
   
    
    
       
          
       

       
       
      
       
          
          
          
          
       
      
      
        
    

因此,如果我们创建一个新订单,并且有一个新客户附加到该订单上,并且说保存该订单,则可能需要级联该订单。但是我们可能不想做的一件事是,如果删除订单以删除相应的客户。

因此,在这里,我们要进行保存更新,因此使用保存更新,它将级联所有对该客户的保存或更新。因此,如果我们获得了新客户或正在更换客户,它将对其进行级联。如果是删除,则不会从数据库中删除。

因此,再次运行我们的应用程序,一切仍然可以按预期进行。

New Customer:
John Doe (00000000-0000-0000-0000-000000000000)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Unspecified)
   CreditRating: Good
   AverageRating: 42.42424242

   Orders:
      Id: 00000000-0000-0000-0000-000000000000
      Order Id: 00000000-0000-0000-0000-000000000000

Reloaded:
John Doe (10b2a3d7-7fcf-483c-b1da-a5bb00b8512e)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: e6680e30-5b3b-4efa-b017-a5bb00b85133
      Order Id: b03858e7-8c36-4555-8878-a5bb00b85134

The orders were ordered by:
John Doe (10b2a3d7-7fcf-483c-b1da-a5bb00b8512e)
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: e6680e30-5b3b-4efa-b017-a5bb00b85133
      Order Id: b03858e7-8c36-4555-8878-a5bb00b85134
      John Doe (10b2a3d7-7fcf-483c-b1da-a5bb00b8512e)
        
   Points: 100
   HasGoldStatus: True
   MemberSince: 1/1/2012 12:00:00 AM (Utc)
   CreditRating: Good
   AverageRating: 42.4242

   Orders:
      Order Id: e6680e30-5b3b-4efa-b017-a5bb00b85133
      Order Id: b03858e7-8c36-4555-8878-a5bb00b85134
        
Press  to exit...

现在,您应该看一下您的应用程序,请记住默认值为None,您必须考虑您的实体以及它们之间的关系,以确定每个实体以及该数据库中每个关系的适当级联。