.net NHibernate级联和生成的guid ID-为什么不为save上的子级生成它们?

.net NHibernate级联和生成的guid ID-为什么不为save上的子级生成它们?,.net,nhibernate,nhibernate-cascade,.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; “用户案例上的级

我做了以下工作:

    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;

“用户案例上的级联”设置为“全部”。但在提交事务之前,不会设置@case.Id。这是预期的行为吗?我非常希望在提交之前获得Id。可以这样做吗?

您是否尝试了
会话。保存或更新(用户)
? 尽管我必须说,级联操作直到需要时才会发生,并且在刷新/提交时才会发生。当您
Session.Save(@case)
时,您没有刷新/提交

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

更纯粹的DDD'y feely可能是将
用户
案例
都建模为聚合根,然后建模它们与角色对象的关系
RelatedCase
(这是在
User
中聚合的,因此应该是cascade=“all delete orphan”)

聚合根应保存在存储库中,如果您将调用委托给
会话.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));
}

在我看来,这是对这类事情进行建模的最漂亮的方式,但在性能方面,你当然会受到一些惩罚。如果一个漂亮的模型对你来说更重要,那么你应该选择这样的方式。

应该提到的是,我使用生成的guid.comb作为标识符。如果我使用Session.Save(@case)它可以很好地生成ID,但我想知道为什么它在级联时不能生成。“User.Cases上的级联设置为All。”:)很抱歉对这个答案的回复太晚了。由于某些原因,我没有看到通知。只是为了清楚,如果我使用Session.Save(@case),它会工作,但我正在寻找更纯粹的DDD感觉。所以你的答案是“级联操作在需要时才会发生,而在刷新/提交时才会发生”,这使得这不可能。从面向对象的角度来看,您是不正确的,我希望它尽可能少地关联。从RDBMS的角度来看,您是正确的,但这就是我使用级联的原因:当我更新用户时,我希望NH也更新(或保存)集合中的任何案例。我在AddCase方法中处理外键引用,以抽象出关系部分。它工作得很好,只是级联启动得太晚了,因此我不会在太晚之前分配ID。谢谢!上面的代码主要是为了示例。真正的代码更像:User.CreateCase(),而不是更多。当然,存储库在域类中是不受欢迎的。根据以下内容建模:。您关于建模与角色对象的关系的观点非常好。我会调查的,但仍然如此。我可能走错了方向,但这并没有得到真正的支持:)哦,是的,我假设你在一个应用程序服务中,可以访问注入的服务,比如工厂和存储库