Nhibernate 添加具有子集合的对象

Nhibernate 添加具有子集合的对象,nhibernate,fluent-nhibernate,one-to-many,mapping-model,Nhibernate,Fluent Nhibernate,One To Many,Mapping Model,我有两个班:站点班和阶段班。Site类定义了阶段的集合。每个类对应一个数据库表。数据库(SQL Server 2000)在两个表之间具有一对多引用,因此给定的站点可以与多个阶段关联,但给定的阶段只能与单个站点关联 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; public class Site { public virtual int Id {ge

我有两个班:站点班和阶段班。Site类定义了阶段的集合。每个类对应一个数据库表。数据库(SQL Server 2000)在两个表之间具有一对多引用,因此给定的站点可以与多个阶段关联,但给定的阶段只能与单个站点关联

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public class Site
{
    public virtual int Id {get; set;}

    [Required]
    [Editable(true)]
    [StringLength(64)]
    public virtual string Name { get; set; }

    public virtual ICollection<Phase> Phases {get; set;}
}

public class Phase
{
    public virtual int Id {get; set;}

    [Required]
    [Editable(true)]
    [StringLength(64)]
    public virtual string Name { get; set; }

    [Editable(true)]
    [StringLength(16)]
    public virtual string Code { get; set; }

    public virtual int SiteId {get; set;}
    public virtual Site Site {get; set;}
}
我已经准备好了以下映射,但它们没有做到这一点:

public class SiteMap : ClassMap<Site>
{
    public SiteMap()
    {
        Id(p => p.Id).Column("ST_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("ST_Name");

        HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").LazyLoad().Inverse().AsSet();
    }
}

public class PhaseMap : ClassMap<Phase>
{
    public PhaseMap()
    {
        Id(p => p.Id).Column("PH_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("PH_Name");
        Map(p => p.Code).Column("PH_Code").Nullable();
        Map(p => p.SiteId).Column("ST_ID");

        References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();
    }
}
公共类站点地图:类地图
{
公共网站地图()
{
Id(p=>p.Id).Column(“ST_Id”).GeneratedBy.Native();
Map(p=>p.Name).Column(“ST_Name”);
HasMany(x=>x.Phases).KeyColumn(“ST_ID”).LazyLoad().Inverse().AsSet();
}
}
公共类阶段映射:类映射
{
公共相位图()
{
Id(p=>p.Id).Column(“PH_Id”).GeneratedBy.Native();
Map(p=>p.Name).Column(“PH_Name”);
Map(p=>p.Code).Column(“PH_代码”).Nullable();
Map(p=>p.SiteId).Column(“ST_ID”);
引用(x=>x.Site).Column(“ST_ID”).LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();
}
}
我对NHibernate一般来说是新手,所以我认识到这里显示的映射可能还有其他问题,我不知道。任何关于如何最好地映射这两个类的帮助都将不胜感激。TIA.

引用(x=>x.Site).Column(“ST_ID”).LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();
References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy).Not.Insert().Not.Update();
应该是

References<Site>(x => x.Site).Column("ST_ID").LazyLoad(Laziness.Proxy);
References(x=>x.Site).Column(“ST_ID”).LazyLoad(Laziness.Proxy);
在插入或更新表时,“不插入”和“更新”规范不会更新此列

您还需要在一对多端指定级联

HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").Cascade.AllDeleteOrphan().LazyLoad().Inverse().AsSet();
HasMany(x=>x.Phases).KeyColumn(“ST_ID”).Cascade.AllDeleteOrphan().LazyLoad().Inverse().AsSet();

可能重复:是否需要Cascase.AllDeleteOrphan如果数据库已经定义了与级联删除的关系?@Ralf,如果配置了数据库,则只需指定
Cascade.SaveUpdate
这样,在保存或插入父数据库时,将保存并插入实体。Thanx。我来玩玩这个,看看它能把我带到哪里去。我感谢你的意见。
HasMany<Phase>(x => x.Phases).KeyColumn("ST_ID").Cascade.AllDeleteOrphan().LazyLoad().Inverse().AsSet();