Удаление сопоставленного объекта NHibernate не работает - вызывает SQL UPDATE - PullRequest
0 голосов
/ 22 марта 2011

У меня возникли проблемы с 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 ]

2 голосов
/ 22 марта 2011

Поскольку вы делаете

user.UserRoles.Remove(userrole);

, пользователь является управляемым объектом, который NHibernate будет обновлять, так же, как вы видите.

1 голос
/ 22 марта 2011

Сначала обновляются пользовательские роли, потому что это то, что вы делаете в первую очередь:

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

Вместо этого удалите роль перед удалением из ассоциаций.

Кроме того, нет необходимости:

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

Они будут обновлены при сбросе сессии. Более того, это недопустимо, поскольку обновление предназначено для использования с диссоциированными объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...