Свободные проблемы коллекции NHibernate HasMany - PullRequest
1 голос
/ 03 октября 2009

Обновление: Похоже, что изменение моего отображения с Cascade.All () на Cascade.AllDeleteOrphan () решает большинство моих проблем. Мне все еще нужно явно установить свойство Company в OperatingState, которое кажется ненужным, поскольку оно добавляется в сущность Company, но, по крайней мере, я могу работать с этим во время обновления. Мне все еще нужно проверить это с помощью create.

Если кто-нибудь сможет это объяснить, это было бы большой помощью.

Обновление 2: После того, как вы поиграете с ним еще раз, кажется, мне не всегда нужно указывать родительский объект.

Исходное сообщение

У меня есть 2 связанных лица

public class Company {
        //... fields
        public virtual IList<OperatingState> OperatingStates { get; set; }
}

public class OperatingState {
        public virtual Company Company { get; set; }// Mapped on CompanyID
        public virtual string State { get; set; }
}

И они отображаются так:

 public class CompanyMap : ClassMap<Company> {
        public CompanyMap() {
        //... fields 
          HasMany(x => x.OperatingStates)
                .Cascade.All()
                .Table("OperatingState");
        }
}
 public class OperatingStateMap : ClassMap<OperatingState> {
        public OperatingStateStateMap() {
            Id(x => x.ID);
            References(x => x.Company);
            Map(x => x.State);
        }
 }

Так что все хорошо, пока я не попытаюсь обновить Компанию с новыми Операционными состояниями

Company company = _repo.GetSingle(123);
 company.OperatingStates.Clear();
 foreach(string state in form["OperatingStates"].Split(',')) {
    company.OperatingStates.Add(new OperatingState(state));
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate

Бомба с:

Невозможно вставить значение NULL в столбец «CompanyID», таблица 'ConsumerCartel.dbo.CompanyOperatingState'; столбец не допускает пустых значений. ВСТАВИТЬ выходит из строя. Заявление было прекращено.

Однако, если я сделаю 2 изменения, это будет работать

Company company = _repo.GetSingle(123);
 // don't clear the list this time;
 foreach(string state in form["OperatingStates"].Split(',')) {
    OperatingState os = new OperatingState(state);
    // explicitly setting the company
    os.Company = company;
    company.OperatingStates.Add(os);
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate

Что добавит новые состояния в дополнение к старым, а это не то, что я хочу. Тем не менее, даже при явной настройке компании (что мне не нужно делать, когда она добавляется в сопоставленный список?), Она не будет работать, если список очищен .

Этот код работал на других объектах, но не на этом, поэтому я думаю, что этот должен работать как написано. Что я делаю не так?

1 Ответ

2 голосов
/ 05 октября 2009

Вы пробовали использовать Inverse ()?

HasMany(x => x.OperatingStates)
    .Inverse()
    .Cascade.All()
    .Table("OperatingState");
...