2016-03-14 55 views
0

我試圖刪除NHibernate中映射表的所有記錄,作爲通過瀏覽器進行功能測試的一部分。從其他問題來看,我得到了所有映射類的類元數據,這些數據爲我提供了表名。從那裏我對數據庫執行SQL刪除語句。這很好,除非我有一個不直接映射的連接表,但映射爲多對多關係的一部分。如何在不知道表名的情況下使用NHibernate刪除JOIN表(多對多)中的記錄

這是我需要清除的多對多關係表,我無法弄清楚如何做到這一點。雖然我不能發佈準確的映射,這裏是數據庫模式非常近似:

BlogPosts 
--------- 
BlogPostId (Primary Key) 

Tags 
---- 
TagId (Primary Key) 

BlogPostTags 
------------ 
BlogPostId (Foreign Key) 
TagId (Foreign Key) 

而且功能NHibernate映射的密切近似值:

public class BlogPostMap : ClassMap<BlogPost> 
{ 
    public BlogPostMap() 
    { 
     // ... 

     HasManyToMany(post => post.Tags) 
      .Table("BlogPostTags") 
      .ChildKeyColumn("TagId") 
      .ParentKeyColumn("BlogPostId") 
      .AsSet() 
      .Access.CamelCaseField() 
      .Cascade.All(); 
    } 
} 

如何刪除記錄在「BlogPostTags」表中沒有硬編碼表名,並且沒有啓用級聯刪除?

回答

1

您可以從配置

Configuration config = ... 
var collection = (Collection)config.GetClassMapping(typeof(BlogPost)).GetProperty("Tags").Value; 
var tablename = collection.CollectionTable.GetQualifiedName(Dialect.GetDialect(config.Properties)); 
+0

好拿到表名。你如何獲得配置? –

+0

棘手的部分是獲取用於創建會話工廠的'NHibernate.Cfg.Configuration'對象。就我而言,我有一個「數據上下文」對象,它包裝了我的NHibernate會話和會話工廠,所以我只是在該類上添加了一個屬性來保存配置。 –