Проблема удаления ребенка из NHibernate - PullRequest
0 голосов
/ 13 апреля 2010

Предположим, я сохранил некоторые разрешения в базе данных, используя этот код:

RoleRepository roleRep = new RoleRepository();
Role role = new Role();
role.PermissionItems = Permission.GetList();
roleRep .SaveOrUpdate(role);

Теперь мне нужен этот код для удаления элементов PermissionItem, связанных с ролью, когда role.PermissionItems == null.

Вот код:

RoleRepository roleRep = new RoleRepository();
Role role = roleRep.Get(roleId);
role.PermissionItems = null;
roleRep .SaveOrUpdate(role);

Но этого не происходит.

Каким должен быть правильный способ справиться с этой ситуацией?

Что / как мне изменить, hbm-файл или код персистенции?

alt text

Role.cs

public class Role
{
    public virtual string RoleName { get; set; }
    public virtual bool IsActive { get; set; }
    public virtual IList<Permission> PermissionItems { get; set; }
}

Role.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="POCO" namespace="POCO">
  <class name="Role" table="Role">
    <id name="ID" column="ID">
      <generator class="native" />
    </id>    
    <property name="RoleName" column="RoleName" />
    <property name="IsActive" column="IsActive" type="System.Boolean" />
    <bag name="PermissionItems" table="Permission" cascade="all" inverse="true">
      <key column="RoleID"/>
      <one-to-many class="Permission" />
    </bag>    
  </class>  
</hibernate-mapping>

Permission.cs

public class Permission
{
    public virtual string MenuItemKey { get; set; }
    public virtual int RoleID { get; set; }
    public virtual Role Role { get; set; }
}

Permission.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="POCO" namespace="POCO">
  <class name="Permission" table="Permission">
    <id name="ID" column="ID">
      <generator class="native"/>
    </id>
    <property name="MenuItemKey" column="MenuItemKey" />
    <property name="RoleID" column="RoleID" />
    <many-to-one name="Role" column="RoleID" not-null="true" cascade="all">      
    </many-to-one>
  </class>
</hibernate-mapping>

Repository.cs

......
    public void SaveOrUpdate(T obj)
            {
                try
                {
                    if (!_session.Transaction.IsActive)
                    {
                        _session.BeginTransaction();
                        _session.SaveOrUpdate(obj);
                        _session.Transaction.Commit();
                        _session.Flush();
                    }
                    else
                    {
                        throw new Exception(CustomErrorMessage.TransactionAlreayInProgress);
                    }
                }
                catch (Exception ex)
                {
                    _session.Transaction.Rollback();
                    _session.Clear();

                    throw ex;
                }
            }
......

RoleRepository.cs

public class RoleRepository : Repository<Role>, IRoleRepository
    {
    }

1 Ответ

3 голосов
/ 13 апреля 2010

Измените отображение ролей на каскадное удаление-удаление-сирота, чтобы потерянные записи разрешений были удалены:

<bag name="PermissionItems" table="Permission" cascade="all-delete-orphan" inverse="true">

и вызовите очистку коллекции вместо установки ее на нуль:

role.PermissionItems.Clear();

Потерянные записи о разрешениях будут удалены при сбросе сеанса.

PS: Ваш блок catch в хранилище должен вызывать throw;, а не throw ex;.

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