2011-03-08 80 views
0

我有兩個類:一個Site類和一個Phase類。 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;} 
} 

我正在使用FluentNHibernate來完成我的映射。我想在這樣的客場映射這一點,我可以創造一個新的站點實例,分配幾個階段情況及打一個電話,讓所有實例到數據庫:

Site site = new Site() { Name = "SiteName" }; 
Phase phase = new Phase() { Name = "PhaseName", Code = "Code" }; 
Phase otherPhase = new Phase() { Name = "OtherPhaseName" }; 

site.Phases.Add(phase); 
site.Phases.Add(otherPhase); 

Session.SaveOrUpdate(site); 

我已經制定了以下映射,但他們沒有做的伎倆:

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(); 
    } 
} 

我是新來的NHibernate一般,所以我承認有可能與這裏所示的對應關係,我是不知道的其他問題。將不勝感激任何協助如何最好地映射這兩個類。 TIA。

+0

可能重複:http://stackoverflow.com/questions/5235311/fluent-nhibernate-cascade-issue-trying-to-insert -null-id – KeithS 2011-03-08 17:57:55

回答

1
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); 

你不插入,當你插入規格更新不更新該列或更新表。

您還需要你的一個指定級聯到許多最終

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

如果數據庫已經有級聯刪除定義的關係,您是否需要Cascase.AllDeleteOrphan? – 2011-03-08 20:39:47

+0

@Ralf,如果您的數據庫已配置,您只需指定'Cascade.SaveUpdate',這樣您的實體將在保存或插入父項時保存並插入。 – Vadim 2011-03-08 20:45:49

+0

Thanx。我會玩弄這個,看看它在哪裏。我很欣賞這些意見。 – 2011-03-08 20:50:37

相關問題