2012-06-11 1 views
2

У меня есть две таблицы, одна называется QuestionText, другая называется State. Когда я вызываю SaveOrUpdate() в QuestionText, он сохраняет штраф, но когда я вызываю SaveOrUpdate() для состояния, я получаю: Иды для этого класса должны быть назначены вручную перед вызовом save(): Entities.StateNhibernate mapping - генерировать «native» говорит, что идентификаторы должны быть назначены вручную

Отображения являются то же для каждого класса.

Любые идеи о том, почему 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:

Я сбросил таблицу состояний и попытался вставить данные. Это дало мне ту же ошибку, что и выше (установите уникальный идентификатор). Затем я опустил таблицу QuestionText и попытался вставить, и он дал - {«Недопустимое имя объекта« eoi.QuestionText ».»}. Значит ли это, что объект объекта (таблица) существует дважды? где-нибудь еще? или, может быть, под другой схемой? Я знаю, что это ключевое слово в SQLServer, поэтому мне интересно, может ли это быть частью проблемы.

+1

Вы проверили, что столбец StateID задан как личность? –

+0

Да, я убедился, что он имеет значение true. Я сниму и заново создаю таблицу. Возможно, это исправит. – EbbnFlow

ответ

4

Оказывается, после прочтения doc и более конкретно линии -

  • По умолчанию атрибутов .NET не сохранять порядок атрибутов; так что вам нужно установить его самостоятельно, когда вопрос о заказе (с использованием первого параметра каждого атрибута); настоятельно рекомендуется установить его, когда у вас есть более одного атрибута на одном члене.

Я обнаружил это с помощью

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

, а затем, глядя на то, что было файл отображение. Элемент «Генератор» никогда не создавался. Это связано с тем, что родительский узел создается после дочернего элемента (генератора), и это заставило элемент «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]". Это может быть ваша БД, сбрасывающаяся с зарезервированным ключевым словом.

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

  • Нет связанных вопросов^_^