我有两个实体,EntityA和EntityB。 EntityB可以选择与EntityA相关联,并具有可为空的外键列。当删除EntityA时,我希望在发出DELETE命令之前将EntityB中的外键设置为null。
因此,当我删除EntityA时,我希望它在发出DELETE命令之前将任何引用的EntityBs中的外键设置为null。我曾经看到NHibernate“意外地”做过这件事,现在我确实希望它这样做,但似乎无法正确做到。我能做的最好的事情是在EntityB变成孤儿后将其删除,但这不是我想要的。当然,我可以在SQL Server中设置外键约束以将列设置为null,但我觉得NHibernate应该能够做到这一点。同样,我可以循环遍历所有由要删除的EntityA引用的EntityB,并将它们设置为null。再次问一下,为什么我必须这样做呢?
以下是我的实体和映射:
我会这样删除:
结果是外键约束违反,因为EntityB.EntityA_Id没有被设置为空。
因此,当我删除EntityA时,我希望它在发出DELETE命令之前将任何引用的EntityBs中的外键设置为null。我曾经看到NHibernate“意外地”做过这件事,现在我确实希望它这样做,但似乎无法正确做到。我能做的最好的事情是在EntityB变成孤儿后将其删除,但这不是我想要的。当然,我可以在SQL Server中设置外键约束以将列设置为null,但我觉得NHibernate应该能够做到这一点。同样,我可以循环遍历所有由要删除的EntityA引用的EntityB,并将它们设置为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没有被设置为空。
KeyNullable().Cascade.All()
吗? - dotjoe