私はC#のpojectsのNHibernateを使用しているので、いくつかのモデルクラスがあります。C#で仮想メソッドを呼び出す代わりに
using System;
namespace TestProject.Model
{
public class Room
{
public virtual int Id { get; set; }
public virtual string UniqueID { get; set; }
public virtual int RoomID { get; set; }
public virtual float Area { get; set; }
}
}
NHibernateのは、これまで正常に動作して、これらのオブジェクトのマッピング:
は、次の例とさせて頂きます。今度は新しいルームオブジェクトを生成したいので、それをデータベースに保存したいと思います。各メンバーを別々に設定しないように、モデルクラスに新しいコンストラクタを追加します。私が書くの仮想メンバーの下 :FxCopのと私のコードを解析
public RoomProperty()
{
}
public RoomProperty(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
は私に次のように伝えます:
"ConstructorShouldNotCallVirtualMethodsRule"
This rule warns the developer if any virtual methods are called in the constructor of a non-sealed type. The problem is that if a derived class overrides the method then that method will be called before the derived constructor has had a chance to run. This makes the code quite fragile.
This page、これは間違っていると私もそれを理解する理由も説明しています。しかし、私は問題をどのように解決するか分かりません。私は標準のコンストラクタを呼び出した後、データを設定する
私はすべてのコンストラクタを消去し、次のメソッドを追加...
public void SetRoomPropertyData(int pRoomId, int pArea)
{
UniqueID = Guid.NewGuid().ToString();
RoomID = pRoomId;
Area = pArea;
}
.... NHibernateのは、初期化失敗becaue私は私のaplicationを開始傾けます。それは言う:
しかし、私はちょうどコンストラクタで仮想メンバを設定するときと同じようにこのメソッドを仮想に設定することは同じミスです。 これらの間違い(違反)を避けるにはどうすればよいですか?
なぜフィールドに値を設定して建設時のプロパティではないのですか? –
@voroninp NHibernateで簡単にフィールドにアクセスすることはできません – Andrey
私のモデルは実際に約10人のメンバーを持ち、新しいルームオブジェクトqiet iftenを作成するためです。私はそれぞれのプロパティを別々に設定したくありません。 – Metalhead89