2

2つのテーブルがあります。1つはQuestionTextと呼ばれ、もう1つはStateと呼ばれます。質問テキストに対してSaveOrUpdate()を呼び出すと、問題なく保存されますが、Stateに対してSaveOrUpdate()を呼び出すと、次のようになります。save()を呼び出す前に、このクラスのIDを手動で割り当てる必要があります。Entities.State

マッピングは各クラスで同じです。

マッピングが明らかに両方とも同じである場合、nHibernateが1つのテーブルに対して自動生成された/ ID指定の主キーに対してこれを言っているのに、別のテーブルに対してこれを言っていない理由についてのアイデアはありますか?

これは正常に動作します:

[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:

Stateテーブルを削除し、データを挿入しようとしました。上記と同じエラーが発生しました(一意のIDを設定してください)。次に、QuestionTextテーブルを削除して挿入しようとすると、-{"無効なオブジェクト名'eoi.QuestionText'。"}が返されました。これは、Stateオブジェクト(テーブル)が2回存在することを意味しますか?何処か別の場所?または多分別のスキーマの下で?StateがSQLServerのキーワードであることを知っているので、これが問題の一部である可能性があるかどうか疑問に思っています。

4

2 に答える 2

4

ドキュメント、より具体的には次の行を読んだ後、それは判明しました-

  • デフォルトでは、.NET属性は属性の順序を保持しません。したがって、順序が重要な場合は自分で設定する必要があります(各属性の最初のパラメーターを使用)。同じメンバーに複数の属性がある場合に設定することを強くお勧めします。

私はこれを使用して発見しました

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

次に、ファイルマッピングが何であるかを確認します。'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; }
于 2012-06-11T18:55:59.657 に答える
1

Table="State"角かっこで囲んでみてください: Table="[State]"。それはあなたのDBがreservedキーワードで吐き出しているかもしれません。

于 2012-06-11T18:40:28.097 に答える