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的簡單情況,所以我假設我已經錯誤地設置了我的映射,但是從我發現的所有示例中,我似乎沒有做到哪裏不對了!
任何答案/建議將是最受歡迎的。謝謝。
謝謝,我試過你的建議,但我仍然有同樣的問題。不過,我嘗試在兩個映射類中使用'.KeyColumn(「RETTaskID」)'並且工作。似乎是有道理的,儘管我一開始並不明白!再次感謝。 – XN16 2013-02-09 08:45:26
哦,是的;)你說得對,我用固定的名字編輯了答案。其實質是爲兩個映射重用一列。 – 2013-02-09 09:18:21