我是nhibernate的新手,所以也許這個回答取決於我缺乏的知識。流利的NHibernate hasmany保存插入空值
我創建這兩個表:
(對不起,意大利語,我希望你能理解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(它插入此列表的最後一個元素)。
任何想法?
我確實嘗試過,但它不起作用:( – frabiacca 2010-09-22 11:17:30
此外,我通過編寫我用來保存實體的方法編輯我的帖子 – frabiacca 2010-09-22 11:17:47
已更新的答案 – Sly 2010-09-22 11:23:39