NHibernate级联和生成的guid id - 为什么它们不是为保存的孩子生成的?

时间:2010-02-09 15:34:32

标签: .net nhibernate nhibernate-cascade

我执行以下操作:

    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;

User.Cases上的级联设置为All。但是@ case.Id在事务提交之前不会设置。这是预期的行为吗?在提交之前我非常想获得Id。可以吗?

2 个答案:

答案 0 :(得分:1)

更纯粹的DDD'y费事可能是将UserCase建模为聚合根,然后模拟它们与角色对象RelatedCase的关系(在User内聚合{1}}因此应该是cascade =“all-delete-orphan”)。

聚合根应保存在存储库中,如果您将调用委托给session.Save(...),则会在您可以使用它时为您提供所需的ID。

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

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

var case = caseFactory.Create("name");
caseRepository.Save(case);

user.AssignCase(case, "Assigned by some dude");

- 并在AddCase中:

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

在我看来,这是塑造这类事物的最漂亮的方式,但你当然会受到一点性能的惩罚。如果一个漂亮的模型对你来说更重要,那么你应该选择这样的东西。

答案 1 :(得分:0)

你试过Session.SaveOrUpdate(User)吗? 虽然我必须说级联操作在需要之前不会发生,并且会在刷新/提交时发生。当你Session.Save(@case)你没有冲洗/提交

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