1

IamはまだNhibernateにまったく慣れていないので、ID列について質問があります。

次のクラスの顧客について考えてみましょう。

class customer
{
    public virtual long ID;
    public virtual string Name;

    public customer()
    {

    }

    public customer(string name)
    {
        Name = name;
    }
}

私が定義したマッピングファイルでは、ID列が生成されています。だから私は新しい顧客を作成したいと思います:

customer c = new customer("Max Mustermann");

今はすべてOKです。IDが生成され、MaxをDBに保存できます。しかし、次のような顧客を生み出す可能性もあります。

customer c = new customer() { ID = 3, Name= "Max Mustermann"};

私は顧客のDB-ID(彼の名前だけ)を本当に知ることができないので、これは不可能なはずです。さらに、私は本当に私のプログラムにIDを必要としないので、私のオブジェクトにIDを持っていることに満足していません。

私の意見では、これはNhibernateの悪いクラス設計です...これを回避する方法はありますか?

ありがとう

編集1:

それはどういう意味ですか?

class customer
{
    protected virtual long _ID;
    public virtual string Name;

    public virtual long GetID 
    {
        get { return _ID; } 
    }

    public customer()
    {

    }

    public customer(string name)
    {
        Name = name;
    }
}

それはうまくいくでしょうか?マッピングファイルはどのようになりますか?

4

1 に答える 1

2

これは「NHibernateの悪いクラス設計」だとおっしゃっていますが、クラスこのように設計する必要があります。NHibernateがデータベースにクエリを実行し、各行を具象クラスに変換するID場合、データベースによって指定された値にプロパティを設定できる必要があります。したがって、その値を設定可能にする必要があります。

ID制約が一時的に無効になっているデータベース(ほとんどのデータベースエンジン)に行を挿入することも可能です。そのため、IDを事前に知ることができます。

これは、ORMが克服しなければならない(多くの!)概念上の問題の1つであり、このような「緩いエッジ」がしばしばあるという事実は、これらの問題がいかに複雑であるかを示しています。

質問を振り返ると、NHibernateが提供する他の機能を損なうことなくIDが設定されるのを防ぐクラス設計を考えることができますか?

于 2012-09-17T12:54:30.760 に答える