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映射、代码映射……谢谢……节省了大量时间来研究这个问题