流利的NHibernate一对多映射 [英] Fluent NHibernate One-To-Many Mapping

查看:125
本文介绍了流利的NHibernate一对多映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下两类:

广告

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆