【问题标题】:Deleting NHibernate mapped object not working - causes sql UPDATE删除 NHibernate 映射对象不起作用 - 导致 sql UPDATE
【发布时间】:2011-03-22 20:47:01
【问题描述】:

我在使用 NHibernate 时遇到了一些问题,同时尝试删除描述两个不同表中的行之间关系的对象 - 多对多关系。

我有用户、课程实例和用户角色,其中用户被映射到某些课程实例。用户可以是许多课程实例的一部分,并且课程实例有很多用户参加。

所有这些都由 Fluent 映射。

User: HasMany(x => x.UserRoles).KeyColumn("UserId");
CourseInstance: HasMany(x => x.UserRoles);
UserRole:
    References(x => x.User).Column("UserId");
    References(x => x.CourseInstance).Column("InstanceId");

上面描述了它们是如何映射在一起的,这是一个相当简单的映射,虽然每个都有一些额外的信息,但彼此之间没有任何关系。

我尝试运行以下代码:

using (var session = factory.OpenSession())
{
    var user = session.Get<NData.User>(userId);
    if (user == null)
        throw new FaultException(new FaultReason("No user with that id found."));
    var instance = session.Get<NData.CourseInstance>(courseInstanceId);
    if (instance == null)
        throw new FaultException(new FaultReason("No course instance with that id found."));
    var userrole = session.CreateQuery(string.Format("from UserRole where User.Id = {0} and CourseInstance.Id = {1} and Role.Role = {2}", userId, courseInstanceId, role)).UniqueResult<NData.UserRole>();
    if (userrole == null)
        throw new FaultException(new FaultReason("That user is not present in that course instance with that role."));
    instance.UserRoles.Remove(userrole);
    user.UserRoles.Remove(userrole);
    session.Delete(userrole);
    session.Update(user);
    session.Update(instance);
    session.Flush();
}

但是,Flush 会抛出异常:

could not delete collection rows: [Giraffe.WebService.NHibernate.Data.User.UserRoles#8][SQL: UPDATE UserRoles SET UserId = null WHERE UserId = @p0 AND Id = @p1]

为什么要先更新角色?

【问题讨论】:

    标签: c# nhibernate fluent


    【解决方案1】:

    因为你在做

    user.UserRoles.Remove(userrole);
    

    正如您所见,用户是 NHibernate 将更新的托管实体。

    【讨论】:

    • 我承认失败.. 叹息。谢谢!
    【解决方案2】:

    它首先更新 UserRoles,因为这是你首先要做的:

    instance.UserRoles.Remove(userrole);
    user.UserRoles.Remove(userrole);
    

    相反,在从关联中删除之前删除角色。

    另外,不需要:

    session.Update(user);
    session.Update(instance);
    

    它们将在会话刷新时更新。此外,这是无效的,因为 Update 旨在与非关联实体一起使用。

    【讨论】:

    • 谢谢伙计,对 NHibernate 的一些了解有助于我理解“逻辑流程”。了解 NHibernate“模型”的最佳资源是什么?
    • 您可以查看文档:nhforge.org/doc/nh/en/index.html 或《NHibernate in Action》一书:manning.com/kuate
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多