2

私は基本的な構造を持っています。UserオブジェクトとUserDetailsオブジェクト。UserテーブルにはUserIdを生成するためのIDプライマリキーがあり、このUserIdのUserDetailsオブジェクトも保存したいと思います。これを個別に行うのは簡単ですが、UserクラスにはUserDetailsオブジェクトへの参照が含まれているため、一度に実行できる方法を見つけようとしています。例えば

User u = new User(){Name = "me"、Age = 17、UserDetails = new UserDetails(){Detail1 = 1}};

したがって、私がしなければならないのは、ユーザーオブジェクトを渡すことだけです。これには、他の関連するサブ情報へのオブジェクトベースの参照が含まれます(この例では大幅に簡略化していますが、UserMatchConfigurationなどのUserDetailsと同様のクラスがいくつかあります。それぞれのフィールドの)

オブジェクトをコードで構築したり、オブジェクトを渡して変更したりしてから、親のUserオブジェクトでsaveを呼び出し、関連するすべてのオブジェクトを保存できるようにしたいです。これまで、1対1のマッピングと保存カスケードを使用してこれを達成しましたが、問題は、新しいオブジェクトを作成するときに、最初にUserクラスを保存するときに、関連するすべてのクラスのUserIdがゼロに設定されることです。生成されたUserIdを関連するすべてのクラスに伝播し、それらを保存します。

これまでのマッピングは以下のとおりです。

<class name="User" table="[User]">
    <id name="UserId" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="FirstName" />
    <property name="LastName" />
    <property name="EmailAddress" />
    <property name="DateOfBirth" />
    <property name="Gender" />
    <property name="PostcodePartOne" />
    <property name="PostcodePartTwo" />
    <many-to-one name="UserLocation" column="UserLocationId" />
    <property name="DateJoined" />
    <property name="LastLoggedOn" />
    <property name="Status"/>
    <property name="StatusNotes" />
    <bag name="Photos" order-by="DisplayOrder asc" inverse="true" lazy="false" cascade="all">
      <key column="UserId" />
      <one-to-many class="UserPhoto" />
    </bag>
    <bag name="Interests" inverse="true" lazy="false" cascade="all">
      <key column="UserId" />
      <one-to-many class="UserMatchInterest" />
    </bag>
    <bag name="Preferences" inverse="true" lazy="false" cascade="all">
      <key column="UserId" />
      <one-to-many class="UserPreference" />
    </bag>
    <one-to-one name="Profile" class="UserProfile" cascade="save-update" />
    <one-to-one name="MatchCriteria" class="UserMatchCriteria" />
    <one-to-one name="MatchLifestyle" class="UserMatchLifestyle" />
    <property name="LastUpdated" />
  </class>

ご覧のとおり、今のところ、プロファイルオブジェクトを使用して試用し、機能させています。メインのUserオブジェクトが最初に保存し、次にUserIdを他のクラスに渡すようにするにはどうすればよいですか?すべてのクラスがそれを主キーとして使用しますか?

ここでも、カスケード保存を実行してから、各サブクラスでUserIdを手動で設定し、それらを個別に保存することはできませんでしたが、1回の呼び出しで実行しようとしています。

4

1 に答える 1

0

あなたはもうすぐそこにいると思います。あなたのuserクラスマッピングは正しいように思われるので、私にとって疑わしいのはですUserProfile

NHibernateはまさにこのスタイルの関係をサポートしており、それはone-to-oneマッピングです(あなたが試したように)。UserProfileマッピングは表示されませんが、ドキュメントに従って拡張してみましょう。

UserProfilehbm

<class name="UserProfile" table="[UserProfile]">
  <id name="UserProfileId" column="UserId">
    <generator class="foreign">
      <param name="property">User</param>
    </generator>
  </id>
  ...
  <one-to-one name="User" class="User" constrained="true"/>
</class>

UserProfileには、次のプロパティが必要です。

public class UserProfile 
{
   public virtual int UserProfileId { get; set; }
   public virtual User User { get; set; }
   ...
}

挿入する前に、両端を接続する必要があります(これは非常に重要なステップです)。

user.Profile =  profile;
profile.User = user;

のカスケードマッピングが次のuser.hbm.xmlようになる場合:

 <one-to-one name="Profile" class="UserProfile" cascade="all" />

を保存するだけで、user他のすべてのエンティティは(正しいか、または)NHiberanteによって永続化されます。とにかくIDを処理する必要はありません。

于 2012-11-23T05:21:13.990 に答える