![](/img/trans.png)
[英](Fluent) NHibernate: HasMany/References (bidirectional) + Cascade Save
[英]Fluent NHibernate hasmany save insert null value
我剛進入休眠狀態,所以響應可能取決於我缺乏知識。
我創建了這兩個表:
(對不起,意大利語,我希望您能毫無問題地理解)。
然后,我在模型中有這些對象:
[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,然后使用list屬性中包含的正確值更新相同的記錄。
這樣對嗎? 我有什么錯誤嗎?
我希望已經澄清了這種情況。 謝謝你們
ps:我正在使用Nhibernate 2.1和流利的nhibernate 1.1
更新 :這是我用來保存實體的代碼。
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列,即使它不在Profilo.IList上顯示(它會插入此List的最后一個元素)。
有任何想法嗎?
KeyColumns映射僅在多對一連接中應用子表。
如果你想有連接,您將需要從使用ID列TBA_portfolio
表和引用它TBA_Sede
。
像這樣:
Tba_portfolio ID | matricola | ruolo
Tba_sede ID | PorfolioId | descrizione
您的映射錯誤,請嘗試以下操作:
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();
}
}
關鍵是,您需要父配置文件來保存其子項。 讓子項對其父項不執行任何操作。 另外,您的表格看起來不對,profolio應該沒有密鑰要seed,但是sede應該有一個fk來保護profolio。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.