我有以下2个类(class):

广告

public virtual int Id { get; set;
public virtual IList<AdvertImage> AdvertImages { get; set; }

AdvertImage
public virtual int Id { get; set; }
public virtual string Filename { get; set;
public virtual Advert Advert { get; set; }

在数据库中,我的AdvertImages表具有FK'AdvertId',它与具有'Id'PK的Adverts表相关。

这是一对多映射,因为一个广告可以包含许多图像。

我的Fluent NHibernate映射(为简洁起见进行了编辑)是:

AdvertMap
Id(x => x.Id)
  .GeneratedBy.Identity();
...
HasMany(x => x.AdvertImages)
  .KeyColumn("AdvertId")
  .Inverse();
...
Table("Adverts");

AdvertImageMap
Id(x => x.Id)
  .GeneratedBy.Identity();
...
References(x => x.Advert)
  .Column("AdvertId");
...
Table("AdvertImages");

我正在代码中创建一个Advert的新实例,然后用AdvertImages填充(广告的)List<AdvertImage>属性。

当我将Advert对象持久保存到数据库时,我希望将AdvertImages插入它们的AdvertImages表中,但是由于两个表之间的关系,我需要首先进行Advert插入,因此PK ID为生成,然后可以将其插入AdvertImages表中。 (当我创建自己的AdvertImage列表时,我正在填充Filename属性,但是显然在那个阶段没有新的AdvertId,因此希望在将广告持久保存到数据库时填充它)。

我尝试使用不同的Inverse()和Cascade设置进行试验,但尚未成功。有人可以帮忙吗?

最佳答案

您需要将Advert映射更改为级联:

Id(x => x.Id)
  .GeneratedBy.Identity();

HasMany(x => x.AdvertImages)
  .KeyColumn("AdvertId")
  .Inverse()
  .Cascade.AllDeleteOrphan();

Table("Adverts");

然后,您应该能够执行这样的操作来保留Advert对象及其子AdvertImage
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();
    }
}

我的实体通常包含用于双向一对多关系的Add和Remove方法,如下所示:
public class Advert
{
    public virtual IList<AdvertImage> AdvertImages { get; set; }

    public virtual void AddImage(AdvertImage newImage)
    {
        newImage.Advert = this;
        AdvertImages.Add(newImage);
    }
}

10-06 00:34