Nhibernate 添加具有子集合的对象
我有两个班:站点班和阶段班。Site类定义了阶段的集合。每个类对应一个数据库表。数据库(SQL Server 2000)在两个表之间具有一对多引用,因此给定的站点可以与多个阶段关联,但给定的阶段只能与单个站点关联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
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();