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
который добавит новые государства в дополнение к старым, которые не то, что я хочу. Однако, даже при явной настройке компании (что мне не нужно делать, когда она добавляется в сопоставленный список?), Это не работает, если список удален.
Этот код работал над другими объектами, но не на этом, поэтому я думаю, что это должно работать как написано. Что я делаю не так?
Спасибо за ваш ответ. Фактически, Inverse помог мне в опции .AllDeleteOrphan(). –