代码之家  ›  专栏  ›  技术社区  ›  asgerhallas

NHibernate cascade和生成的guid id-为什么不为保存时的子项生成它们?

  •  0
  • asgerhallas  · 技术社区  · 14 年前

    我执行以下操作:

        var @case = new Case
        {
            Name = "test"
        };
    
        // User is persistent and loaded in the same session
        User.AddCase(@case); // sets @case.User = User too
        Session.Update(User);
    
        response.CaseId = @case.Id;
    

    用户上的级联。Cases设置为All。但在提交事务之前,不会设置@case.Id。这是预期的行为吗?我很想在提交之前拿到身份证。能做到吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   mookid8000    14 年前

    一个更纯粹的DDD'y feely的东西可能是模型两者 User Case 作为聚合根,然后将它们与角色对象的关系建模 RelatedCase (这是在内部聚合的 用户 因此应该是cascade=“all delete orphan”)。

    聚合根应保存在存储库中,如果将调用委托给 session.Save(...) )会在你可以使用的时候给你你需要的身份证。

    然后,角色可以(根据我的经验,至少在一段时间后)包含描述关系的额外信息,并且既不属于用户,也不属于案例。假设这种关系可以跟踪用户和案例之间的关系。

    这样您的代码就可以如下所示:

    var case = caseFactory.Create("name");
    caseRepository.Save(case);
    
    user.AssignCase(case, "Assigned by some dude");
    

    -以及内部地址:

    public void AddCase(Case case, string reason)
    {
        cases.Add(new RelatedCase(case, reason));
    }
    

    在我看来,这是最漂亮的方式来模拟这种事情,但你当然会惩罚一点点表现明智。如果一个漂亮的模特对你来说更重要,那么你应该选择这样的。

        2
  •  0
  •   Jaguar    14 年前

    你试过了吗 Session.SaveOrUpdate(User) ? 尽管我必须说,级联操作在需要时才会发生,并且在flush/commit时才会发生。当你 Session.Save(@case) 你没有冲水

    说你犯了一个逻辑错误: 通过创建@case,您不会更新用户。用户是一个单独的实体,并且 Case 有用户的外键。所以保存案例是正确的,用户的案例列表只是关联信息