流利的NHibernate一对多映射 [英] Fluent NHibernate One-To-Many Mapping
问题描述
我有以下两类:
广告
public virtual int Id {get;组;
公共虚拟IList< AdvertImage> AdvertImages {get;组; }
AdvertImage
public virtual int Id {get;组; }
公共虚拟字符串Filename {get;组;
public virtual Advert Advert {get;组;在DB中,我的AdvertImages表具有与广告表相关的FKAdvertId有一个Id的PK。
这是一个一对多的映射,因为一个广告可以有很多的图像。
我的流利的NHibernate映射(为简洁起见)是:
$ b $ p AdvertMap Id(x => x.Id)
.GeneratedBy.Identity();
...
HasMany(x => x.AdvertImages)
.KeyColumn(AdvertId)
.Inverse();
...
表(广告);
AdvertImageMap
Id(x => x.Id)
.GeneratedBy.Identity();
...
引用(x => x.Advert)
.Column(AdvertId);
...
表(AdvertImages);
我正在创建一个新的实例然后用 List< AdvertImage>
。
$填充 AdvertImages
属性(Advert) b
$ b 当我将我的广告
对象保存到数据库时,我想将AdvertImages插入到他们的AdvertImages表中,对于两个表之间的关系,我需要首先发生Advert插入,以便生成PK Id,然后可以将其插入到AdvertImages表中。 (当我创建AdvertImage的列表时,我填充了Filename属性,但显然在该阶段没有新的AdvertId,所以当广告被持久化到DB时要填充)。 b
$ b
我尝试过使用不同的Inverse()和Cascade设置,但还没有成功。任何人都可以帮忙吗?
解决方案您需要更改您的广告
映射级联:
Id(x => x.Id)
.GeneratedBy.Identity();
HasMany(x => x.AdvertImages)
.KeyColumn(AdvertId)
.Inverse()
.Cascade.AllDeleteOrphan();
表格(广告);
然后,您应该可以做这样的事情来坚持一个 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();
$ b我的实体通常包含用于双向的Add和Remove方法到这样的许多关系:
public class Advert
{
public virtual IList< AdvertImage> AdvertImages {get;组; }
public virtual void AddImage(AdvertImage newImage)
{
newImage.Advert = this;
AdvertImages.Add(newImage);
}
}
I have the following 2 classes:
Advert
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; }
In the DB, my AdvertImages table has the FK 'AdvertId' which relates to the Adverts table which has the PK of 'Id'.
This is a One-To-Many mapping, in that one advert can have many images.
My Fluent NHibernate mappings (edited for brevity) are:
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");
I am creating a new instance of Advert
in code, then populating the AdvertImages
property (of Advert) with a List<AdvertImage>
.
When I go to persist my Advert
object to the DB, I would like the AdvertImages to be inserted into their AdvertImages table, but due to the relationship between the 2 tables, I need the Advert insertion to happen first, so as the PK Id is generated, which can then be inserted in the AdvertImages table. (When I create my list of AdvertImage, I am populating the Filename property, but obviously don't have the new AdvertId at that stage, so want that to be populated when the advert is persisted to the DB).
I have tried experimenting with different Inverse() and Cascade settings but haven't succeeded yet. Can anyone help please?
解决方案 You need to change your Advert
mapping to cascade:
Id(x => x.Id)
.GeneratedBy.Identity();
HasMany(x => x.AdvertImages)
.KeyColumn("AdvertId")
.Inverse()
.Cascade.AllDeleteOrphan();
Table("Adverts");
You should then be able to do something like this to persist an Advert
object and it's children 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();
}
}
My entities usually contain Add and Remove methods for bidirectional one to many relationships like this:
public class Advert
{
public virtual IList<AdvertImage> AdvertImages { get; set; }
public virtual void AddImage(AdvertImage newImage)
{
newImage.Advert = this;
AdvertImages.Add(newImage);
}
}
这篇关于流利的NHibernate一对多映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!