功能NHibernate一个一对多的映射(Fluent NHibernate One-To-Many

2019-07-29 16:44发布

我有以下2类:

广告

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; }

在DB,我AdvertImages表中有FK“AdvertId”,这涉及一种具有“ID”的PK的广告表。

这是一个一对多的映射,在一个广告可以有很多图片。

我的功能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表,但由于2和表之间的关系,我需要的广告插入首先发生,这样的PK Id为产生,其然后可以在AdvertImages表被插入。 (当我创建我的AdvertImage的名单,我填充FileName属性,但显然没有在这个阶段的新AdvertId,所以希望在广告被永久保存到数据库,要填充)。

我曾尝试用不同的逆()和Cascade设置试验,但尚未成功。 任何人都可以帮助吗?

Answer 1:

你需要改变你的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();
    }
}

我的实体通常含有添加和删除的双向一到很多这样的关系方法:

public class Advert
{
    public virtual IList<AdvertImage> AdvertImages { get; set; }

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


Answer 2:

我遇到过同样的问题。 我花了一段时间尝试各种不同类型的映射。 后来我发现我的映射关系都很好,这是实际上是我需要总结我的会议事务和session.SaveOrUpdate()方法后使用commit()方法。

using(var session = sessionFactory.OpenSession()) 
using(var tx = session.BeginTransaction()) 
{ 
// execute code that uses the session 
tx.Commit(); 
}


Answer 3:

什么对我的作品通常设置外键列,允许在DB空 - 这将是你的AdvertId列,但我不知道是否会在你的情况下工作,因为你正在使用的身份。 NHibernate的是什么做的是一个查询,然后更新子表的外键列到父表的正确的ID插入所有。 也许它会在你的工作的情况下也。

下面是一些类似的问题,这可能有助于: 级联插上一到多用流利的NHibernate



文章来源: Fluent NHibernate One-To-Many Mapping