我目前正在开发的项目是使用实体框架,但是我们遇到了一些问题,因此我正在研究使用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");
}
}
注意:这些实体继承的Domain类包含ID(int Id)。
我面临的问题是,当我从ID为27的数据库中获取I Task时,我得到ID为27的TaskProperty,而不是与任务相关的预期的4个TaskProperties通过外键。
这在Entity Framework中运行良好,我知道这对于任何ORM都是一个简单的情况,所以我假设我已经错误地设置了映射,但是从我发现的所有示例中,我似乎没有做任何事情错了!
欢迎任何答案/建议。感谢。
答案 0 :(得分:1)
你快到了。 HasMany和References的Column映射必须相同:
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");
}
集合项必须具有对所有者的引用列。此列用于两个方向,因为这是DB管理中的引用...