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