Свободные проблемы с сохранением коллекции NHibernate Child
У меня есть следующие классы отображения (скопирована только соответствующая часть):
public class CardTemplateMapping : ClassMap<CardTemplate>
{
public CardTemplateMapping()
{
Table("cardtemplate");
Id(x => x.Id)
.Column("id")
.GeneratedBy.Native();
HasMany(x => x.CostStructures)
.KeyColumn("cardtemplate_id")
.Cascade.All();
}
}
public class CostStructureMapping : ClassMap<CostStructure>
{
public CostStructureMapping()
{
Table("coststructure");
Id(x => x.Id)
.Column("id")
.GeneratedBy.Native();
References(x => x.CardTemplate)
.Column("cardtemplate_id");
HasMany(x => x.CostComponents)
.KeyColumn("coststructure_id")
.Cascade.AllDeleteOrphan();
}
}
public class CostStructureComponentMapping : ClassMap<CostStructureComponent>
{
public CostStructureComponentMapping()
{
Table("CostStructureComponent");
Id(x => x.Id)
.Column("id")
.GeneratedBy.Native();
References(x => x.CostStructure)
.Column("coststructure_id");
References(x => x.ResourceType)
.Column("resourcetype_id");
}
}
Nhibernate загружает отношения, как я и предполагал. Но две части картографии кажутся немного странными (или это, или мои ожидания странные).
Первый:
CostStructure structure = new CostStructure() { CardTemplate = template };
template.CostStructures.Add(structure);
Session.Save(template);
Session.Flush();
Это не сохраняет новыйCostStructure
экземпляр. Почему?
Второй: если я загрузилCardTemplate
иметьCostStructure
содержащий триCostStructureComponent
юридические лица. Теперь я хочу удалить один из техCostStructureComponents
изCostStructure
.
Я попробовал следующее:
costStructure.CostComponents.Remove(component);
component.CostStructure = null;
session.Save(template)
Теперь я знаю, что явное удаление явно работает, но не должноDeleteOrphan
часть также утверждают, что компонент, теперь безCostStructure
ссылка, удаляется? Вместо этого NHibernate пытается выполнить следующее обновление:
UPDATE CostStructureComponent
SET amount = @p0,
coststructure_id = @p1,
resourcetype_id = @p2
WHERE id = @p3;
@p0 = 1 [Type: Int32 (0)],
@p1 = NULL [Type: Int64 (0)],
@p2 = 5 [Type: Int64 (0)],
@p3 = 13 [Type: Int64 (0)]
Может быть, Equals / GetHashCode были реализованы неправильно?
Извините, уже поздно, был долгий день и так далее ... Если я говорю тарабарщину, пожалуйста, дайте мне знать ...