В настоящее время я работаю над Entity Framework, но есть некоторые проблемы, с которыми мы столкнулись, и поэтому я изучаю использование 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).
Проблема, с которой я столкнулся, заключается в том, что когда я получаю I Task из базы данных с идентификатором 27, например, я получаю TaskProperty с идентификатором 27, а не ожидаемыми 4 TaskProperties, которые связаны с Задача с помощью внешнего ключа.
Это прекрасно работало в Entity Framework, и я знаю, что это простая ситуация для любого ORM, поэтому я предполагаю, что неправильно настроил свои сопоставления, но из всех найденных мною примеров я, кажется, не делаю ничего плохого!
Любые ответы/предложения будут наиболее желанными. Благодарю.
Спасибо, я попробовал, что вы предложили, но у меня все еще такая же проблема. Однако я попытался использовать '.KeyColumn (" RETTaskID ")' в обоих классах сопоставления, и это сработало. Кажется, имеет смысл, хотя я и не получил его сначала! Еще раз спасибо. – XN16
О, да;) Вы правы, я отредактировал ответ с фиксированными именами. Суть заключается в повторном использовании одного столбца для обоих отображений. –