0

我执行以下操作:

    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。可以做到吗?

4

2 回答 2

1

更纯粹的 DDD'y 感觉可能是将两者建模UserCase聚合根,然后建模它们与角色对象的关系RelatedCase(这是在内部聚合的User,因此应该是 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));
}

在我看来,这是对这种东西建模的最漂亮的方法,但你当然会在性能方面受到一点惩罚。如果一个漂亮的模特对你来说更重要,那么你应该选择这样的东西。

于 2010-03-17T12:40:31.173 回答
0

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

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

于 2010-02-13T13:12:44.310 回答