2012-06-11 55 views
2

我有兩個表,一個叫做QuestionText,另一個叫做State。當我將SaveOrUpdate()調用到QuestionText時,它可以很好地保存,但是當我調用SaveOrUpdate()時,我得到:此類的ids必須在調用save()之前手動分配:Entities.StateNhibernate映射 - 生成「本地」說ID必須手動分配

映射每班同樣。

關於爲什麼nHibernate說這是爲自動生成的/ Identity指定的主鍵爲一個表,但不是另一個...當映射顯然都是相同的任何想法?

這一個正常工作:

[Serializable()] 
[Class(NameType = typeof(QuestionText), Table = "QuestionText", Schema = "eoi")] 
public class QuestionText 
{ 
    #region Public Properties 
    [NHibernate.Mapping.Attributes.Generator(Class = "native")] 
    [NHibernate.Mapping.Attributes.Id(Name = "QuestionTextID")] 
    public virtual int? QuestionTextID { get; set; } 

    [NHibernate.Mapping.Attributes.Property] 
    public virtual string QuestionDescription { get; set; } 

    [NHibernate.Mapping.Attributes.Property] 
    public virtual string QuestionCategory { get; set; } 

    [NHibernate.Mapping.Attributes.Property] 
    public virtual string QuestionDisplayTitle { get; set; } 

    #endregion 
} 

這一個不:

[Serializable()] 
[Class(NameType = typeof(State), Table = "State", Schema = "eoi")] 
public class State 
{ 
    #region Public Properties 

    [NHibernate.Mapping.Attributes.Generator(Class = "native")] 
    [NHibernate.Mapping.Attributes.Id(Name = "StateID")] 
    public virtual int? StateID { get; set; } 

    [NHibernate.Mapping.Attributes.Property] 
    public virtual string StateAbbreviation { get; set; } 

    [NHibernate.Mapping.Attributes.Property] 
    public virtual string StateName { get; set; } 

    #endregion //Public Properties 
}//end of class 

和我保存方法:

internal T Save(T obj) 
{ 
     using (ISession dbSession = EOIDB.GetSession()) 
     using (ITransaction transaction = dbSession.BeginTransaction()) 
     { 
      try 
      { 
       dbSession.SaveOrUpdate(obj); 
       transaction.Commit(); 
       return obj; 
      } 
      catch (Exception ex) 
      { 
       transaction.Rollback(); 
       throw ex; 
      } 
     } 
} 

UPDATE1:

我刪除了狀態表,並嘗試插入數據。它給了我與上面相同的錯誤(設置唯一ID)。然後,我刪除了QuestionText表並嘗試插入並給出了 - {「無效的對象名'eoi.QuestionText'。」}。那麼這是否意味着州對象(表)存在兩次?別的地方?或者可能在另一個模式下?我知道State是SQLServer中的一個關鍵字,所以我想知道這是否可能是問題的一部分。

+1

你是否檢查過StateID列設置爲身份? –

+0

是的,我確定它的身份設置爲true。我會放下並重新創建表格。也許這會解決它。 – EbbnFlow

回答

4

原來讀doc,更具體的行之後 -

  • 默認情況下,.NET屬性不保留屬性的順序;所以 你需要自己設置它,當訂單問題時(使用每個屬性的第一個 參數);強烈建議在 的同一成員上有多個屬性時進行設置。

我用

HbmSerializer.Default.Serialize(
System.Reflection.Assembly.GetAssembly(
typeof(State)), @"C:\temp\EOI.Mappings.xml"); 

,然後望着眼前的文件映射被發現這一點。 'Generator'元素從未被創建。這是因爲父節點是在child(generator)之後創建的,這導致'id'元素沒有'generator'子元素。所以我改變了我的屬性(見下文),它開始工作

[NHibernate.Mapping.Attributes.Id(0,Name = "StateID",Column="StateID")] 
[NHibernate.Mapping.Attributes.Generator(1,Class="native")] 
public virtual int? StateID { get; set; } 
1

嘗試用方括號將Table="State"括起來:Table="[State]"。這可能是你的數據庫用保留關鍵字拋出。

相關問題