2009-10-03 5 views
1

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

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

Обновление 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 

It бомбы с:

Не удается вставить значение NULL в столбце 'CompanyID', таблица 'ConsumerCartel.dbo.CompanyOperatingState'; столбец не разрешает ошибки. INSERT не работает. Заявление было завершено .

Однако, если я делаю 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 

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

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

ответ

2

Вы пытались использовать инверсию()?

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

Спасибо за ваш ответ. Фактически, Inverse помог мне в опции .AllDeleteOrphan(). –

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