У меня есть две сущности, EntityA и EntityB. EntityB может опционально быть связанным с EntityA, и имеет столбец внешнего ключа, который может иметь значение NULL. Когда EntityA удален, я хочу, чтобы внешний ключ в EntityB был установлен в null.
Поэтому, когда я удаляю EntityA, я бы хотел, чтобы он установил внешний ключ в любых ссылочных EntityBs перед выполнением команды DELETE. Я видел, как NHibernate делал это раньше, «случайно», и теперь, когда я действительно хочу, чтобы это делалось, я не могу понять, что это правильно. Лучшее, что я смог сделать, - это удалить EntityB после того, как он осиротел, а это не то, чего я хочу. Конечно, я мог бы установить ограничение внешнего ключа в SQL Server, чтобы установить для столбца значение null, но я чувствую, что NHibernate должен быть в состоянии сделать это. Точно так же я мог бы перебрать все EntityB, на которые ссылается EntityA для удаления, и установить для них значение null. Опять же, почему я должен?
Вот мои сущности и отображения:
public class EntityA : Entity // Entity contains the ID property and implements GetHashCode() and Equals()
{
// irrelevant properties
public virtual IList<EntityB> EntityBs { get; protected set; }
}
public class EntityB : Entity
{
// irrelevant properties
public virtual EntityA EntityA { get; set; }
}
public class EntityAMap: ClassMap<EntityA>
{
public EntityAMap()
{
HasMany(c => c.EntityBs)
.ForeignKeyConstraintName("FK_EntityA_EntityB")
.KeyColumn("EntityA_Id")
.Inverse()
.Cascade.None(); // i've tried other cascade settings with little luck
}
}
public class EntityBMap: ClassMap<EntityB>
{
public EntityBMap()
{
References(c => c.EntityA)
.Nullable()
.Column("EntityA_Id")
.ForeignKey("FK_EntityA_EntityB")
.Index("IX_EntityB_EntityA_Id")
.Cascade.None();
}
}
Затем я удаляю вот так:
var entityA = Repository.Get(idToDelete);
// entityA.EntityBs.Clear(); // tried this, no affect
Repository.Remove(entityA);
Repository.Flush(); // is it possible this isn't working because I'm missing a Tx?
Результатом является нарушение ограничения внешнего ключа, поскольку EntityB.EntityA_Id не обнуляется.