2013-02-08 101 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