2011-11-29 123 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属性。