NHibernate - 删除时将外键列设置为null

4
我有两个实体,EntityA和EntityB。 EntityB可以选择与EntityA相关联,并具有可为空的外键列。当删除EntityA时,我希望在发出DELETE命令之前将EntityB中的外键设置为null。
因此,当我删除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没有被设置为空。

你尝试过将 hasmany 设置为 KeyNullable().Cascade.All() 吗? - dotjoe
2个回答

1
你需要做类似这样的事情:
entityA.EntityBs.ToList().ForEach(b => b.EntityA = null );

Repository.Remove(entityA);
Repository.Flush();

如果还有B在引用A,就不能删除A,尤其是没有级联操作的情况下。

1
是的,我意识到这是其中一个选项。我觉得我以前见过nhibernate处理这个问题,我想看看是否只是正确映射的问题,然后再进行强制操作。 - moribvndvs

0

你需要将所有级联设置为none,然后在EntityBMap中使用.inverse()。如果有用,请给我反馈。

Mariusz


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接