2015-01-19 2 views
1

У меня проблема с несогласованностью (в моей программе) при удалении сущности с помощью Nhibernate.C# nhibernate id автоматически сбрасывается при удалении или нет?

Мне нужно хранить сущности и двоичные отношения, которые связывают их.

Вот модель:

public interface IPersistent 
{ 
    int ID { get ; set;}   
} 

public virtual class Entity : IPersistent { 
    //relations where the entity appears on the left side 
    public ISet<Relation> LeftRelations { get;} 

    //relations where the entity appears on the right side 
    public ISet<Relation> RightRelations { get;}  
} 

public virtual class Relation : IPersistent { 
    public Entity LeftEntity  { get;} 
    public Entity RightEntity { get;} 
    public RelationType Type  { get;} 

    // must be called before ISession.Delete() 
    public void ClearRelation(){ 
     LeftEntity.LeftRelations.Remove(this); 
     RightEntity.RightRelations.Remove(this); 
     LeftEntity = null; 
     RightEntity = null; 
    } 
} 

мое отображение выглядит следующим образом:

<class name="Entity" table="entity"> 
    <id column="id_entity" name"ID" unsaved-value="-1" type=Int32> 
     <generator class ="native"> 
      <param name ="sequence">seq_task_id_entity</param> 
     </generator> 
    </id> 
    <set name="LeftRelations" table ="relation" generic="true" 
      cascade="all" inverse="true"> 
     <key column="left_entity" foreign-key="id_entity"/> 
     <one-to-many class ="Relation"/>  
    </set> 
    <set name="RightRelations" table ="relation" generic="true" 
      cascade="all" inverse="true"> 
     <key column ="right_entity" foreign-key ="id_entity"/> 
     <one-to-many class ="Relation"/>  
    </set> 
</class> 

<class name="Relation" table="relation" > 
    <id column="id_relation" name"ID" unsaved-value="-1" type=Int32> 
     <generator class ="native"> 
      <param name ="sequence">seq_task_id_relation</param> 
     </generator> 
    </id> 
    <many-to-one name ="LeftEntity" class="Entity" cascade="all" 
        update="true" not-null="true"> 
      <column name ="left_entity" sql-type="integer" not-null ="true"></column> 
    </many-to-one> 

    <many-to-one name ="RightEntity" class ="Item" cascade="all" 
        update="true" not-null="true"> 
      <column name ="right_entity" sql-type="integer" not-null ="true"></column> 
    </many-to-one> 
</class> 

я может сохраняться как сущности и отношения экземпляров. Когда я удаляю постоянный объект (который не связан с каким-либо отношением), его свойство идентификатора обновляется до несохраненного значения после фиксации. Но когда я удаляю постоянное отношение, строка отношений в базе данных удаляется, но свойство отношения'ID не возвращается к несохраненному значению.

Это обычное поведение? Или это неверно?

+0

Что именно вы подразумеваете под * "... но свойство ID остается" *? Где это свойство остается? –

+0

Я обновил свой вопрос. Свойство ID удаляемого отношения не возвращается к несохраненному значению (-1). – tumasgiu

ответ

2

Чтобы ответить на этот вопрос:

Но когда я удалить сохраненное отношение, отношение строка в базе данных удаляется, но свойство relation'ID не сбрасывается в неспасенной стоимость.

unsaved-value The является установка используется для сравнить. Это не inteded to Установленное значение.

NHibernate просто нуждается в этой настройке, чтобы понять, должен ли объект, переданный ISession, рассматриваться как переходный или существующий в БД.

unsaved-value просто установка постоянная - используется только для сравнения и принятия решения: это объект переходными или существующим.

Документация:

5.1.4. id

<id 
    name="PropertyName"      (1) 
    type="typename"       (2) 
    column="column_name"      (3) 
    unsaved-value="any|none|null|id_value" (4) 
    access="field|property|nosetter|ClassName(5)"> 
    ... 

...
(4) unsaved-value(опционально - по умолчанию в "разумном" значение): Свойство идентификатора значение, указывающее, что экземпляр вновь создается (несохраненный), отличая его от трассы nsient, которые были сохранены или загружены в предыдущем сеансе.

+0

Понял. Таким образом, нет способа узнать, удалена ли сущность? – tumasgiu

+0

Нет ... но. Каждая операция записи должна быть обернута внутри некоторой транзакции, и после этого мы должны закрыть сеанс.Позже, когда мы хотим получить доступ к некоторым «измененным» материалам, мы должны (ДОЛЖНЫ) использовать новый сеанс без старых объектов. Всегда делайте все возможное, чтобы разделить операции WRITE и READ –

+0

Итак, объекты NH должны рассматриваться как DTO? – tumasgiu

Смежные вопросы