删除NHibernate映射对象不起作用 - 导致sql UPDATE

时间:2011-03-22 20:47:02

标签: c# nhibernate fluent

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

我有Users,CourseInstances和UserRoles,用户被映射到某些课程实例。用户可以是许多课程实例的一部分,课程实例有许多用户参加。

所有这些都由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]

为什么要先尝试更新角色?

2 个答案:

答案 0 :(得分:2)

因为你正在做

user.UserRoles.Remove(userrole);

用户是NHibernate将更新的托管实体,正如您所看到的那样。

答案 1 :(得分:1)

首先更新UserRoles,因为这是你先做的事情:

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

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

此外,没有必要:

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

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