NHibernate.TransientObjectException - PullRequest
       14

NHibernate.TransientObjectException

0 голосов
/ 07 октября 2018

Исключение - сообщение NHibernate.TransientObjectException - "объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом или задайте каскадное действие для свойства, которое сделало бы его автосохраненным.

Я хочу создать POSTи PUT вызывает сохранение роли и добавление / обновление UserRolePermissions для него

Я изучил несколько похожих вопросов, но не могу заставить мой код работать. Пожалуйста, дайте мне знать, если кто-нибудь может исправить его.

У меня есть 3 таблицы:

Role
public virtual int RoleId { get; set; }
public virtual IList<UserRolePermission> UserRolePermissions { get; set; }

Permission
public virtual int PermissionId { get; set; }
public virtual IList<UserRolePermission> UserRolePermissions { get; set; }

UserRolePermission
public virtual int UserRolePermissionId { get; set; }
public virtual Permission Permission { get; set; }
public virtual Role Role { get; set; }

FluentNHibernate Mapping :

public RoleMap()
{
    Table("Role");
    HasMany(x => x.UserRolePermissions)
                    .Table("UserRolePermission");
}

public UserRolePermissionMap()
{
    Table("UserRolePermission");
    References(x => x.Role).Column("RoleId").Not.Nullable();
    References(x => x.Permission).Column("PermissionId").Not.Nullable();
}

public PermissionMap()
{
    Table("Permission");
    HasMany(x => x.UserRolePermissions)
                    .Table("UserRolePermission")
                    .Inverse();
}

// Code 

_unitOfWork.BeginTransaction();
// code to save Role 
//code to save UserRolePermission
_unitOfWork.Commit(); <-- getting the exception here during the POST call as it tries to save Role first and the Role in UserRolePermission is in transient state

Я даже пытался изменить UserRolePermission, как показано ниже, для использования каскада, но не нашел удачи -

public UserRolePermissionMap()
{
    Table("UserRolePermission");
    References(x => x.Role).Column("RoleId").Not.Nullable().Cascade.All();
    References(x => x.Permission).Column("PermissionId").Cascade.All();
} 

Обратите внимание, что я использую Automappers исписок UserRolePermission автоматически привязан к роли. Во время _unitOfWork.Commit () я получаю вышеуказанную ошибку (см. строку в коде)

В случае, если я игнорирую отображение UserRolePermission из роли и отображаю его явно,POST работает нормально, но вызов PUT начинает выдавать ошибку, что: невозможно вставить нульl RoleId в UserRolePermission (из-за ранее существовавшего UserRolePermission).

Пожалуйста, дайте мне знать, что я делаю неправильно?

...