Свободная карта nhibernate список предметов - PullRequest
1 голос
/ 24 ноября 2011

У меня есть класс "Компания", в котором есть список "Оператор"

public class Company
{
   public IList<Opertator> Operators {get; set; }
   public Int32 Id {get; set;}
}

public class Operator {
   public Int32 Id {get; set; }
  public Company Company {get; set; }
}

Когда я отобразил следующее:

public class CompanyMapping : ClassMap<Company>
    {
        public ProductMapping() : base()
        {
            Id(x => x.Id, "CompanyId").GeneratedBy.Native();
            HasMany(x => x.Operators);
         }
    }

public class OperatorMapping : ClassMap<Operator>
{
    public OperatorMapping() 
    {
          Id(x => x.Id);
          Reference(x => x.Company);
    }
}

У меня есть пользовательский интерфейс, где пользователь может добавлять операторы и удалять операторы, установив флажки. в коде c # я запрашиваю сохраненную компанию и добавляю в список или удаляю из списка. затем отправьте SaveOrUpdate. Моя проблема в том, что когда я добавляю еще одного оператора в существующую компанию и сохраняю / обновляю, NHibernate удаляет весь список и восстанавливает их снова.

Я не хочу этого делать. Могу ли я сказать, что NHibernate обнаружит измененные элементы (новые элементы из списка, вставит их, определит удаленные элементы и удалит их)?

Я попытался изменить отображение для отображения в компании

HasMany(x => x.Operators).Inverse();

но в итоге ничего не удаляется. Любая помощь?

1 Ответ

0 голосов
/ 24 ноября 2011

Inverse говорит, что оператор отвечает за ассоциацию, и вы должны установить его при добавлении Operator в компанию

public class Company
{
    public Int32 Id {get; set;}

    public ICollection<Opertator> Operators {get; private set; }

    public void Add(Opertator operator)
    {
        Operators.Add(operator);
        operator.Company = this;
    }

    public Company()
    {
        Operators = new List<Operator>();
    }
}

// and

HasMany(x => x.Operators).Inverse();

// use it like

company.Add(new Operator()); // instead of company.Operators.Add(new Operator());
...