C# 删除NHibernate映射对象不工作-导致sql更新

C# 删除NHibernate映射对象不工作-导致sql更新,c#,nhibernate,fluent,C#,Nhibernate,Fluent,我在试图删除描述两个不同表中的行之间关系的对象(多对多关系)时,遇到了NHibernate方面的一些问题 我有用户、CourseInstances和UserRoles,其中用户映射到某些课程实例。用户可以是许多课程实例的一部分,并且课程实例有许多用户参与 所有这些都由Fluent映射 User: HasMany(x => x.UserRoles).KeyColumn("UserId"); CourseInstance: HasMany(x => x.UserRoles); UserR

我在试图删除描述两个不同表中的行之间关系的对象(多对多关系)时,遇到了NHibernate方面的一些问题

我有用户、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();
}
为什么它要先更新角色?

因为你正在这样做

user.UserRoles.Remove(userrole);
用户是NHibernate将更新的托管实体,正如您所看到的。

因为您正在进行更新

user.UserRoles.Remove(userrole);

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

它首先更新用户角色,因为这是您首先要做的:

instance.UserRoles.Remove(userrole);
user.UserRoles.Remove(userrole);
相反,请在从关联中删除角色之前删除该角色

此外,不需要:

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

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

它首先更新用户角色,因为这是您首先要做的:

instance.UserRoles.Remove(userrole);
user.UserRoles.Remove(userrole);
相反,请在从关联中删除角色之前删除该角色

此外,不需要:

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

刷新会话时将更新它们。此外,这是无效的,因为更新意味着要与未关联的实体一起使用。

我承认失败。。唉。谢谢我承认失败。。唉。谢谢谢谢,伙计,对NHibernate有一点了解,这有助于我理解“逻辑流”。了解NHibernate“模型”的最佳资源是什么?您可以查看文档:或《NHibernate在行动中》一书:。谢谢,伙计,了解一下NHibernate,这有助于我理解“逻辑流”。了解NHibernate“模型”的最佳资源是什么?您可以查看文档:或NHibernate in Action:一书。