2

NHibernateとHiLo戦略を使用していますが、問題は、コレクション内のオブジェクトのIDがSession.Save()で生成されないことです(Transaction.Commit()でのみ)。例えば:

ImageGallery imageGallery = imageGalleryRepository.GetById(imgGalleryId);
imageGallery.Images.Add(new Image());
imageGalleryRepository.Save(imageGallery); // Here I need to access ID propery of new image in Images collection but it's 0 until I commit transaction. Can it be done?

これが私が持っているコードです:

public abstract class Entity
{
    public virtual int Id { get; set; }
}

public class ImageGallery : Entity
{
    public virtual IList<Image> Images { get; set; }
    // ...
}

public class Image : Entity
{
    public string FileName { get; set; }
    public ImageGallery ImageGallery { get; set; }
    // ...
}

マッピング:

public class ImageGalleryMap : ClassMap<ImageGallery>
{
    public ImageGalleryMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo("hibernate_unique_key", "next_hi_image_gallery", "10");
        HasMany(x => x.Images).
            Cascade.All().
            KeyColumn("GalleryId").
            Inverse().
            Fetch.Join();
    }
}

public class GalleryImageMap : ClassMap<GalleryImage>
{
    public GalleryImageMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo("hibernate_unique_key", "next_hi_image", "10");
        Map(x => x.FileName);
        References(x => x.ImageGallery).Column("GalleryId");
    }
}
4

2 に答える 2

2

Session.Save は必ずしもデータベースへの変更をフラッシュするとは限りません。セッションは、データベースの変更を含む作業単位です。変更がすぐにデータベースにポストされるとは限りません。Session.Flush() の使用をご覧ください。より詳細な説明については、以下をお読みください。

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-flushing

編集:

双方向の関係がある場合、コードの観点からもこれを維持する必要があります。したがって、次のようなことをする必要があります。

ImageGallery imageGallery = imageGalleryRepository.GetById(imgGalleryId);
Image newImage = new Image();
newImage.ImageGallery = imageGallery;
imageGallery.Images.Add(newImage);

imageGalleryRepository.Save(imageGallery);

通常、上記のコードで明示的に行うのではなく、エンティティで Add/Remove メソッドを使用してこれを行います。

この回答またはここの他の回答が役立つ場合は、回答としてマークするチェックマークをクリックしてください。

于 2011-05-18T00:43:26.100 に答える
0

既存のオブジェクトのカスケード変更は、フラッシュしてデータベースに移動するまで発生しません。セッションに関連付けられた新しいオブジェクト (画像) が必要な場合は、セッションで save を呼び出して新しいオブジェクトを渡すことにより、セッション自体に追加する必要があります。セッションに追加する新しいギャラリー オブジェクトがある場合、オブジェクト グラフをトラバースし、参照された子を追加します。

また (あまり重要ではありませんが、指摘するだけです)、getbyid を使用したセッションから既に取得したギャラリー自体に対して save を呼び出す必要はありません。それはセッションに既に存在し、セッションがフラッシュされたときに変更が保持されます。保存は、実際にはセッションに何かを追加するための操作です。既に存在するものを追加しようとしても気にしません。実際には何もしません。

于 2011-11-28T18:01:55.353 に答える