2013-06-18 75 views
0

我使用流利的nhibernate,我會打開刪除級聯。但我不工作。它只會刪除外鍵。 以下配置功能NHibernate:流利的nhibernate刪除級聯

 public virtual void TreatConfiguration(NHibernate.Cfg.Configuration configuration) 
    { 
     var update = new SchemaUpdate(configuration); 
     update.Execute(false, true); 
    } 

    public ISessionFactory CreateSessionFactory(string istanza, string db) 
    { 
     //string server = @"BRUX-PC\SQLEXPRESS"; 
     //int port = 1433; 
     string server = istanza; 
     string database = db; 
     const string user = "xxxx"; 
     const string password = "xxxx"; 

     var connectionString = string.Format("Server={0};Database={1};User Id={2};Password={3};", 
              server, database, user, password); 

     var autoMap = AutoMap.AssemblyOf<AggregateBase>() 
          .Where(t => typeof (AggregateBase).IsAssignableFrom(t)) 
          .Conventions.Add(
           ConventionBuilder.HasMany.Always(x => x.Cascade.AllDeleteOrphan()), 
           PrimaryKey.Name.Is(o => "Id"), 
           ForeignKey.EndsWith("Id"), 
           DefaultLazy.Never(), 
           DefaultCascade.All(), 
           DynamicUpdate.AlwaysTrue(), 
           DynamicInsert.AlwaysTrue() 
      ); 



     return Fluently.Configure() 
         .Database(
          MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)) 
         .Mappings(m => m.AutoMappings.Add(autoMap)) 
         .ExposeConfiguration(TreatConfiguration) 
         .BuildSessionFactory(); 
    } 

我的控制器:

     contabilitaRepository.RemoveByIdFattura(testataContabilita.IdFattura); 

我的倉庫:

 public void RemoveByIdFattura(Guid? id) 
    { 
     var userToDelete = 
      repository.Single(c => c.IdFattura == id); 

     repository 
      .Remove(userToDelete); 
    } 

我的模型:

public class TestataContabilita : AggregateBase 
    { 
     public virtual Guid IdFattura 
     { 
      get; 
      set; 
     } 
     public virtual int NumeroRegistrazione 
     { 
      get; 
      set; 
     } 
     public virtual string TipoVendita 
     { 
      get; 
      set; 
     } 

     public virtual IList<CorpoContabilita> CorpoContabilita { get; set; } 


    } 

    public class CorpoContabilita : AggregateBase 
    { 

     public virtual int NumeroRegistrazione 
     { 
      get; 
      set; 
     } 
     public virtual int? ControPartita 
     { 
      get; 
      set; 
     } 
     public virtual string Automatico 
     { 
      get; 
      set; 
     } 
} 

當我運行eliminatio n,我只在「CorpoContabilita」保留時刪除「TestataContabilita」,但只刪除前綴鍵。爲什麼?

回答

1

你可能需要做 ConventionBuilder.HasMany.Always(X => x.Cascade.AllDeleteOrphan()反()

在映射

你也需要做

TestataContabilita.CorpoContabilita.Clear();

從集合中刪除的項目

+0

thx for you answer but但是,我無法調用「ConventionBuilder.HasMany.Always(x => x.Cascade.AllDeleteOrphan()。Inverse())」,因爲它無法識別「反向」,然後我應該在哪裏插入「TestataContabilita.CorpoContabilita.Clear();」如果我在「repository.Remove(userToDelete);」之前將它插入到我的資源庫中,當我承諾不刪除孩子=( – Brux88

1

我試圖重現您 案件。我實現了某種類型的存儲庫,並且您的映射只是按照它的設想工作。用集合CorpoContabilita刪除testataContabilita對象。

但是我第一次意外地在存儲庫中犯了一些錯誤,並且在外鍵中也得到了空值。事實上,即使在刪除testataContabilita之前它們也是空的 - 由於實施中的錯誤。

那麼,你使用什麼樣的存儲庫實現?你如何使用Session和Transaction對象?您執行保存的對象是什麼?也許你可以在完全實現的地方上傳你的項目。