我执行以下操作:
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。可以吗?
答案 0 :(得分:1)
更纯粹的DDD'y费事可能是将User
和Case
建模为聚合根,然后模拟它们与角色对象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
具有用户的外键。因此保存案例是正确的,用户案例列表只是关联信息