2010-09-22 51 views
0

我是nhibernate的新手,所以也許這個回答取決於我缺乏的知識。流利的NHibernate hasmany保存插入空值

我創建這兩個表: alt text

(對不起,意大利語,我希望你能理解withouth的任何問題)。

以後,我就在我的模型,這些對象:


[Serializable] 
public class Profilo 
{ 
    public virtual int Id { get; set; } 
    public virtual string Matricola { get; set; } 
    public virtual string Ruolo { get; set; } 
    public virtual IList ListaSedi { get; set; } 

    public Profilo() 
    { 
     ListaSedi = new List(); 
    } 
} 

[Serializable] 
public class Sede 
{ 
    public virtual string CodiceSede { get; set; } 
    public virtual string DescrizioneSede { get; set; } 
    public virtual Profilo Profilo { get; set; } 
} 

這是我映射使用功能NHibernate實體的方式:


    public class Map_Sede : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Sede() 
     { 
      Table("TBA_Sede"); 

      Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned(); 

      Map(x => x.DescrizioneSede) 
       .Column("descrizione"); 


      References(prof => prof.Profilo) 
       .Column("codice_sede"); 

     } 

    } 


    public class Map_Profilo : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Profilo() 
     { 
      Table("TBA_Profilo"); 

      Id(x => x.Id).Column("id").GeneratedBy.Identity(); 

      Map(x => x.Matricola) 
       .Column("matricola"); 

      Map(x => x.Ruolo) 
       .Column("ruolo"); 

      HasMany(x => x.ListaSedi) 
       .AsBag() 
       .KeyColumns.Add("codice_sede") 
       .Not.LazyLoad() 
       .Cascade.None(); 

     } 
    } 

現在,我想插入一個新Profilo公司我的例子。一切似乎工作,但nhibernate不插入TBA_Profilo.codice_sede列的值。我注意到insert語句由兩個參數(matricola,ruolo)組成 - 爲什麼它忘記了第三個參數?

我讀了一些地方(在nhibernate郵件列表),這是很正常的'原因nhiberate先插入null值,然後用列表屬性中包含的正確值更新相同的記錄。

是不是? 我在做任何錯誤?

我希望澄清一下情況。 THX傢伙

PS:我使用NHibernate 2.1和功能NHibernate 1.1

UPDATE:這是我用來保存實體的代碼。


       var sesionFactory = NHibernateHelper.createSessionFactory(); 

       using (NHibernate.ISession session = sesionFactory.OpenSession()) 
       { 
        using (var transaction = session.BeginTransaction()) 
        { 
         try 
         { 
          session.SaveOrUpdate(entity); 
          transaction.Commit(); 
          session.Flush(); 
         } 
         catch (Exception) 
         { 
          transaction.Rollback(); 
          throw; 
         } 
         finally 
         { 
          transaction.Dispose(); 
         } 
        } 
       } 

更新2:繼狡猾的回答我稍微修改我的解決方案。這些都是新的模型實體:



[Serializable] 
public class Profilo 
{ 
    public virtual int Id { get; set; } 
    public virtual string Matricola { get; set; } 
    public virtual string Ruolo { get; set; } 
    public virtual IList ListaSedi { get; set; } 

    public Profilo() 
    { 
     ListaSedi = new List(); 
    } 
} 

[Serializable] 
public class Sede 
{ 
    public virtual string CodiceSede { get; set; } 
    public virtual string DescrizioneSede { get; set; } 
    public virtual IList ProfiliAssociati { get; set; } 
} 

和新映射:


public class Map_Sede : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Sede() 
     { 
      Table("TBA_Sede"); 

      Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned(); 

      Map(x => x.DescrizioneSede) 
       .Column("descrizione"); 


      HasMany(x => x.ProfiliAssociati) 
       .AsBag() 
       .KeyColumns.Add("codice_sede") 
       .Cascade.All(); 


     } 

    } 


    public class Map_Profilo : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Profilo() 
     { 
      Table("TBA_Profilo"); 

      Id(x => x.Id).Column("id").GeneratedBy.Identity(); 

      Map(x => x.Matricola) 
       .Column("matricola"); 

      Map(x => x.Ruolo) 
       .Column("ruolo"); 

      HasMany(x => x.ListaSedi) 
       .AsBag() 
       .Inverse() 
       .KeyColumns.Add("codice_sede") 
       .Cascade.SaveUpdate(); 

     } 
    } 

現在看來相當工作:我的意思是NHibernate的可以寫TBA_Profilo.codice_sede列,即使它不cicle Profilo公司上.IList(它插入此列表的最後一個元素)。

任何想法?

回答

1

KeyColumns映射僅適用於多對一連接的子表。

如果要連接,您需要使用TBA_portfolio表中的Id列,並從TBA_Sede引用它。

事情是這樣的:

Tba_portfolio ID | matricola | ruolo

Tba_sede ID | PorfolioId | descrizione

+0

我確實嘗試過,但它不起作用:( – frabiacca 2010-09-22 11:17:30

+0

此外,我通過編寫我用來保存實體的方法編輯我的帖子 – frabiacca 2010-09-22 11:17:47

+0

已更新的答案 – Sly 2010-09-22 11:23:39

0

你的映射是錯誤的,試試這個:

public class Map_Profilo : FluentNHibernate.Mapping.ClassMap 
    { 
     public Map_Profilo() 
     { 
      Table("TBA_Profilo"); 

      Id(x => x.Id).Column("id").GeneratedBy.Identity(); 

      Map(x => x.Matricola) 
       .Column("matricola"); 

      Map(x => x.Ruolo) 
       .Column("ruolo"); 

      HasMany(x => x.ListaSedi) 
       .AsBag() 
       .KeyColumns.Add("codice_sede") 
       .Not.LazyLoad() 
       .Cascade.SaveUpdate(); 

     } 
    } 

public class Map_Sede : FluentNHibernate.Mapping.ClassMap 
{ 
    public Map_Sede() 
    { 
     Table("TBA_Sede"); 

     Id(x => x.CodiceSede).Column("codice_sede").GeneratedBy.Assigned(); 

     Map(x => x.DescrizioneSede) 
      .Column("descrizione"); 


     References(prof => prof.Profilo) 
      .Column("codice_sede") 
      .Cascade.None() 
      .Inverse(); 

    } 

} 

的關鍵是,您需要父級profilio來保存其子項。讓子項目對其父項不做任何事情。另外,你的表格看起來不對,profolio不應該有sede的鍵,但sede應該有一個fk來表達。

+0

自從我處理該映射後,它會持續很長時間,我真的不知道這是否應該是正確的解決方案,無論如何,thx爲您的答案;) – frabiacca 2011-05-25 10:30:02