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