Fluent NHibernate一对多映射
我有以下两门课: 广告Fluent NHibernate一对多映射,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,我有以下两门课: 广告 public virtual int Id { get; set; public virtual IList<AdvertImage> AdvertImages { get; set; } public virtual int Id { get; set; } public virtual string Filename { get; set; public virtual Advert Advert { get; set; } Id(x => x.
public virtual int Id { get; set;
public virtual IList<AdvertImage> AdvertImages { get; set; }
public virtual int Id { get; set; }
public virtual string Filename { get; set;
public virtual Advert Advert { get; set; }
Id(x => x.Id)
.GeneratedBy.Identity();
...
HasMany(x => x.AdvertImages)
.KeyColumn("AdvertId")
.Inverse();
...
Table("Adverts");
Id(x => x.Id)
.GeneratedBy.Identity();
...
References(x => x.Advert)
.Column("AdvertId");
...
Table("AdvertImages");
在DB中,my AdvertImages表具有FK“AdvertId”,该FK“AdvertId”与主键为“Id”的Adverts表相关
这是一个一对多的映射,一个广告可以有许多图像
我的Fluent NHibernate映射(为了简洁而编辑)是:
广告地图
public virtual int Id { get; set;
public virtual IList<AdvertImage> AdvertImages { get; set; }
public virtual int Id { get; set; }
public virtual string Filename { get; set;
public virtual Advert Advert { get; set; }
Id(x => x.Id)
.GeneratedBy.Identity();
...
HasMany(x => x.AdvertImages)
.KeyColumn("AdvertId")
.Inverse();
...
Table("Adverts");
Id(x => x.Id)
.GeneratedBy.Identity();
...
References(x => x.Advert)
.Column("AdvertId");
...
Table("AdvertImages");
广告图像地图
public virtual int Id { get; set;
public virtual IList<AdvertImage> AdvertImages { get; set; }
public virtual int Id { get; set; }
public virtual string Filename { get; set;
public virtual Advert Advert { get; set; }
Id(x => x.Id)
.GeneratedBy.Identity();
...
HasMany(x => x.AdvertImages)
.KeyColumn("AdvertId")
.Inverse();
...
Table("Adverts");
Id(x => x.Id)
.GeneratedBy.Identity();
...
References(x => x.Advert)
.Column("AdvertId");
...
Table("AdvertImages");
我正在代码中创建一个新的Advert
实例,然后用列表
填充AdvertImages
属性(Advert)
当我将我的Advert
对象持久化到DB中时,我希望将AdvertImages插入到他们的AdvertImages表中,但是由于这两个表之间的关系,我需要首先插入Advert,以便生成PK Id,然后可以将其插入到AdvertImages表中。(当我创建我的AdvertImage列表时,我正在填充Filename属性,但显然在该阶段没有新的AdvertId,因此希望在将广告持久化到DB时填充该属性)
我尝试过不同的Inverse()和Cascade设置,但还没有成功。有人能帮忙吗?通常对我有效的方法是将外键列设置为允许DB中的null-这将是您的AdverID列,但我不确定这是否适用于您的情况,因为您使用的是identity。NHibernate所做的是在一个查询中插入all,然后将子表外键列更新为父表的正确id。也许这在你的情况下也适用
这里有一些类似的问题可能会有所帮助:您需要将
广告映射更改为级联:
Id(x => x.Id)
.GeneratedBy.Identity();
HasMany(x => x.AdvertImages)
.KeyColumn("AdvertId")
.Inverse()
.Cascade.AllDeleteOrphan();
Table("Adverts");
然后,您应该能够执行类似的操作来持久化广告
对象及其子对象广告图像
Advert newAdvert = new Advert();
AdvertImage newImage = new AdvertImage();
newImage.Advert = newAdvert;
newAdvert.AdvertImages.Add(newImage);
using(NHibernate.ISession session = SessionFactory.GetCurrentSession())
{
using (NHibernate.ITransaction tran = session.BeginTransaction())
{
session.Save(newAdvert);
tran.Commit();
}
}
“我的实体”通常包含双向一对多关系的添加和删除方法,如下所示:
public class Advert
{
public virtual IList<AdvertImage> AdvertImages { get; set; }
public virtual void AddImage(AdvertImage newImage)
{
newImage.Advert = this;
AdvertImages.Add(newImage);
}
}
公共类广告
{
公共虚拟IList广告图像{get;set;}
公共虚拟空添加图像(AdverImage newImage)
{
newImage.Advert=这个;
AdvertImages.Add(newImage);
}
}
我也有同样的问题。我花了一段时间尝试所有不同类型的映射。然后我发现我的映射很好,实际上我需要将会话包装在事务中,并在session.SaveOrUpdate()方法之后使用Commit()方法
谢谢Cole W,还有一个很好的提示:添加和删除方法。你包含的链接毫无意义,因为它与Fluent-NHibernate
@KomengeMwandila无关。虽然我链接的问题的答案没有使用Fluent-NHibernate,但问题确实如此。此外,Fluent NHibernate在这里没有添加任何新内容。它只是提供了NHibernate映射的另一个接口。一旦您了解了映射的工作原理,就可以将其应用于Fluent NHibernate、XML映射、代码映射……谢谢……节省了大量时间来研究这个问题