我有以下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设置试验,但尚未成功。 任何人都可以帮助吗?
你需要改变你的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);
}
}
我遇到过同样的问题。 我花了一段时间尝试各种不同类型的映射。 后来我发现我的映射关系都很好,这是实际上是我需要总结我的会议事务和session.SaveOrUpdate()方法后使用commit()方法。
using(var session = sessionFactory.OpenSession())
using(var tx = session.BeginTransaction())
{
// execute code that uses the session
tx.Commit();
}
什么对我的作品通常设置外键列,允许在DB空 - 这将是你的AdvertId列,但我不知道是否会在你的情况下工作,因为你正在使用的身份。 NHibernate的是什么做的是一个查询,然后更新子表的外键列到父表的正确的ID插入所有。 也许它会在你的工作的情况下也。
下面是一些类似的问题,这可能有助于: 级联插上一到多用流利的NHibernate