![](/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.