2013-02-08 3 views
1

В настоящее время я работаю над 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, поэтому я предполагаю, что неправильно настроил свои сопоставления, но из всех найденных мною примеров я, кажется, не делаю ничего плохого!

Любые ответы/предложения будут наиболее желанными. Благодарю.

ответ

1

Вы почти находитесь. Отображение столбца для HasMany и ссылки должны быть одинаковыми:

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 управляется ...

+0

Спасибо, я попробовал, что вы предложили, но у меня все еще такая же проблема. Однако я попытался использовать '.KeyColumn (" RETTaskID ")' в обоих классах сопоставления, и это сработало. Кажется, имеет смысл, хотя я и не получил его сначала! Еще раз спасибо. – XN16

+0

О, да;) Вы правы, я отредактировал ответ с фиксированными именами. Суть заключается в повторном использовании одного столбца для обоих отображений. –

Смежные вопросы