2011-11-29 150 views
0

我有一個「活動」實體,這個實體可以有幾個「任務」。流利Nhibernate:一對多的問題

此處可用於實體的代碼:

public class Activity : Entity<int> 
{ 
    public virtual int Id { get; set; } 
    public virtual string Code { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Iesi.Collections.Generic.ISet<Task> Tasks { get; set; } 

    public Activity() 
    { 
     Tasks = new Iesi.Collections.Generic.HashedSet<Task>(); 
    } 
} 

public class Task 
{ 
    public virtual int Id { get; set; } 
    public virtual string Code { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Activity Activity { get; set; } 
} 

映射:

public ActivityMap() 
{ 
    Id(x => x.Id).GeneratedBy.Native(); 
    Map(x => x.Code); 
    Map(x => x.Name); 

    HasMany(x => x.Tasks) 
     .KeyColumns.Add("Activity") 
     .AsSet() 
     .Inverse() 
     .Cascade.AllDeleteOrphan(); 
} 

public TaskMap() 
{ 
    Id(x => x.Id).GeneratedBy.Native(); 
    Map(x => x.Code); 
    Map(x => x.Name); 
} 

測試:

activity = new Activity 
{ 
    Code = "...", 
    Name = "..." 
}; 

Task task = new Task 
{ 
    Code = "...", 
    Name ="...", 
    Activity = activity 
}; 
session.Save(activity); 

我看到惠普NHProf 2插入。 提交後,我做了一個實體「Activity」的GetById,但「Tasks」屬性是空的。在數據庫中,「活動」字段(實體「任務」)爲空。

+0

嘿克里斯,問題解決了嗎? – gdoron

回答

2
activity = new Activity 
{ 
    Code = "...", 
    Name = "..." 
}; 

Task task = new Task 
{ 
    Code = "...", 
    Name ="...", 
    Activity = activity 
}; 
activity.Tasks.Add(task); 
session.Save(activity); 

你必須保持兩邊對象之間的關係。

P.S.也許你應該改變級聯爲.Cascade.All();,因爲當我嘗試刪除孤兒時,它似乎並不正確。

更新: as @Stefan Steinegger提到你沒有映射活動。

public TaskMap() 
{ 
    Id(x => x.Id).GeneratedBy.Native(); 
    Map(x => x.Code); 
    Map(x => x.Name); 
    References(x => x.Activity); //Missing mapping 
} 

但是你仍然需要更新雙方的關係。

+0

這很奇怪,因爲在NHProg中,我看到一個Insert for Task和另一個for Ativity。解決方案2應該工作,我試着用你的代碼,同樣,我看到2插入但「活動」字段仍然爲空。讓我試試第一個。 –

+0

@克里斯 - 我,我更新了我的答案。請再試一次。 – gdoron

+0

奇怪的是,當我生成de數據庫時,表「Task」中沒有「Activity」字段,值爲空。但有一個字段「Activity_id」不爲空。我試圖設置「.KeyColumns.Add(」Activity「)」。 –

2

您沒有映射任務的Activity屬性。