2011-08-10 28 views
1

我有兩個表:NHibernate問題:意外的行數:0;預計:1

DIC_STATUS:

STATUS_ID 

    1 
    2 

DIC_STATUS_STRINGS:

STATUS_ID LANG_ID STATUS_NAME 

    1   1   Name1 
    1   2   Name1_1 
    2   1   Name2 
    2   2   Name2_2 

和類:

public class StatusS : AbstractDictionaryObject 
    { 
     public virtual string StatusName { get; set; } 
     public virtual Languages Lang { get; set; } 
     public virtual Status Status { get; set; } 
    } 

    public class Status:AbstractDisplayDictionary 
    { 
     [Browsable(false)] 
     public IList<StatusS> DicStatusStrings { get; set; } 
     public Status() 
     { 
      DicStatusStrings = new List<StatusS>(); 
     } 
    } 

public abstract class AbstractDisplayDictionary 
    { 
     [Browsable(false)] 
     public virtual int Id { get; set; } 
     [DisplayName("Наименование на русском")] 
     public virtual string NameRu { get; set; } 
     [DisplayName("Наименование на казахском")] 
     public virtual string NameKz { get; set; } 
    } 

映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="EArchive.Data" namespace="EArchive.Data.Class"> 
    <class name="Status" table="DIC_STATUS" lazy="false"> 
    <id name="Id" column="STATUS_ID"> 
     <generator class="increment"> 
     </generator> 
    </id> 
    <bag name="DicStatusStrings" inverse="true" cascade="all-delete-orphan"> 
     <key column="STATUS_ID" /> 
     <one-to-many class="StatusS" /> 
    </bag> 
    <property name="NameRu" 
       formula="(SELECT str.STATUS_NAME FROM DIC_STATUS_STRINGS str 
       WHERE str.Status_Id = Status_Id and str.Lang_Id=1)"/> 

    <property name="NameKz" 
       formula="(SELECT str.STATUS_NAME FROM DIC_STATUS_STRINGS str 
       WHERE str.Status_Id = Status_Id and str.Lang_Id=2)"/>  
    </class> 
</hibernate-mapping> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="EArchive.Data" namespace="EArchive.Data.Class"> 
<class name="StatusS" table="DIC_STATUS_STRINGS" lazy="false"> 
    <composite-id>  
    <key-many-to-one name="Status" class="Status"> 
     <column name="STATUS_ID"/> 
    </key-many-to-one> 
    <key-property name="LangId" column="LANG_ID"/> 
    </composite-id> 
    <property name="StatusName" column="STATUS_NAME"/> 
    <many-to-one name="Lang" class="Languages" column="LANG_ID" /> 
</class> 
</hibernate-mapping> 

方法來添加記錄:

public void AddRecord(object record) 
     { 
      StatusDAO statusDao = GetStatusDAO(); 
      var status = (Status) record; 
      IList<StatusS> statusS = status.DicStatusStrings; 
      status.DicStatusStrings = null; 
      status = statusDao.Save(status); 

      foreach (var s in statusS) 
      { 
       s.Status = status; 
      } 
      status.DicStatusStrings = statusS; 
      statusDao.Update(status); 
     } 

我有錯誤只添加記錄,編輯效果很好。謝謝。

編輯: Equals和GetHashCode方法被覆蓋。

+0

它可能是導致此問題的數據庫觸發器。看到這裏: http://stackoverflow.com/questions/821981/nhibernate-updating-a-table-with-a-trigger-on-it-causes-an-error-unexpected – user2173353

回答

1

我有與複合鍵相同的問題。它與Equals()和GetHashCode()有關。

你必須override those,否則NHibernate無法知道它們之間的區別。

看一看herehere瞭解更多信息。

編輯:它實際上與保存的和未保存的對象之間的匹配有關。缺少Equals和GetHashCode的重寫是可以導致這種情況的多重事件之一。

+0

:我做到了,只是沒有寫有問題。 – user348173

+0

我注意到Status.DicStatusStrings上的inverse =「true」。如果您在狀態上調用更新,它會使對方負責關係,以防止它被設置。 –

+0

我已刪除此屬性,但添加不起作用。 – user348173

相關問題