我目前正在从事的项目是使用实体框架,但是我们遇到了一些问题,因此我正在研究使用 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,而不是通过外部与 Task 相关的预期的 4 个 TaskProperty钥匙。
这在实体框架中运行良好,我知道这对于任何 ORM 来说都是一个简单的情况,所以我假设我的映射设置不正确,但是从我找到的所有示例来看,我似乎没有做错任何事情!
任何答案/建议都将受到欢迎。谢谢。