2013-02-08 82 views
1

我目前正在使用的项目是使用实体框架,但也有一些我们遇到的问题,因此我正在研究使用NHibernate,我们认为这将解决大多数问题我们有。基本流利NHibernate的关系问题

无论如何,我一直在复制系统的一个简单部分,但我遇到了一个非常简单的问题,即一对多关系,因为它给出了非常奇怪的结果。

这里是我的实体:

public class Task : Base.Domain 
{ 
    private IList<TaskProperty> _taskProperties = new BindingList<taskProperty>(); 
    private string _name = String.Empty; 
    private string _description = String.Empty; 

    public virtual IList<TaskProperty> TaskProperties 
    { 
     get 
     { 
      return _taskProperties; 
     } 
     set 
     { 
      if (_taskProperties == value) return; 
      _taskProperties = value; 
      OnNotifiyPropertyChanged("TaskProperties"); 
     } 
    } 

    public virtual string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      if (_name == value) return; 
      _name = value; 
      base.OnNotifiyPropertyChanged("Name"); 
     } 
    } 

    public virtual string Description 
    { 
     get 
     { 
      return _description; 
     } 
     set 
     { 
      if (_description == value) return; 
      _description = value; 
      base.OnNotifiyPropertyChanged("Description"); 
     } 
    } 

    public Task() 
     : base() 
    { }  
} 

public class TaskProperty : Base.Domain 
{ 
    private Task _task = null; 
    private string _name = string.Empty; 
    private string _description = string.Empty; 
    private int _propertyType = 0;    

    //public virtual int TaskID { get; set; } 
    public virtual Task Task 
    { 
     get 
     { 
      return _task; 
     } 
     set 
     { 
      if (_task == value) return; 
      _task = value; 
      OnNotifiyPropertyChanged("Task"); 
     } 
    } 

    public virtual string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      if (_name == value) return; 
      _name = value; 
      OnNotifiyPropertyChanged("Name"); 
     } 
    } 

    public virtual string Description 
    { 
     get 
     { 
      return _description; 
     } 
     set 
     { 
      if (_description == value) return; 
      _description = value; 
      OnNotifiyPropertyChanged("Description"); 
     } 
    } 

    public virtual int PropertyType 
    { 
     get 
     { 
      return _propertyType; 
     } 
     set 
     { 
      if (_propertyType == value) return; 
      _propertyType = value; 
      OnNotifiyPropertyChanged("PropertyType"); 
     } 
    } 

    public TaskProperty() 
     : base() 
    { }  
} 

这里是我的NHibernate映射:

public class TaskMapping : ClassMap<Task> 
{ 
    public TaskMapping() 
    { 
     Id(x => x.Id).Column("RETTaskID"); 
     Map(x => x.Name); 
     Map(x => x.Description); 
     Map(x => x.Version); 
     HasMany(x => x.TaskProperties).KeyColumn("RETTaskPropertyID"); 
     Table("RETTask"); 
    } 
} 

public class TaskPropertyMapping : ClassMap<TaskProperty> 
{ 
    public TaskPropertyMapping() 
    { 
     Id(x => x.Id).Column("RETTaskPropertyID"); 
     Map(x => x.Name); 
     Map(x => x.Description); 
     Map(x => x.PropertyType); 
     References(x => x.Task).Column("RETTaskID"); 
     Table("RETTaskProperty"); 
    } 
} 

注:这些实体从继承域类持有的ID(INT ID)。

我面临的问题是,当我从ID为27的数据库中获取I Task时,例如,我得到ID为27的TaskProperty,而不是预期的4个TaskProperties,它们与任务通过一个外键。

这在实体框架中运行良好,我知道这是任何ORM的简单情况,所以我假设我已经错误地设置了我的映射,但是从我发现的所有示例中,我似乎没有做到哪里不对了!

任何答案/建议将是最受欢迎的。谢谢。

回答

1

你几乎在那里。 HasMany和引用的列映射必须相同:

public TaskMapping() 
{ 
    ... 
    HasMany(x => x.TaskProperties).KeyColumn("RETTaskID"); // use this 
    // HasMany(x => x.TaskProperties).KeyColumn("RETTaskPropertyID"); // instead of this 
} 
public TaskPropertyMapping() 
{ 
    ... 
    References(x => x.Task).Column("RETTaskID"); 
} 

集合项必须具有所有者的引用列。这个列用于两个方向,因为这是如何参考数据库管理...

+0

谢谢,我试过你的建议,但我仍然有同样的问题。不过,我尝试在两个映射类中使用'.KeyColumn(“RETTaskID”)'并且工作。似乎是有道理的,尽管我一开始并不明白!再次感谢。 – XN16 2013-02-09 08:45:26

+0

哦,是的;)你说得对,我用固定的名字编辑了答案。其实质是为两个映射重用一列。 – 2013-02-09 09:18:21