2010-09-22 49 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