3

流暢な nhibernate 3.3.1 でエンティティ インスタンスをコピーするにはどうすればよいですか。データベースからオブジェクトを読み取り、オブジェクトを取得しました。次に、このオブジェクトの値をいくつか変更します。少し変更を加えたこのオブジェクトを保存します。

Id を 0 に設定しようとしましたが、これは機能しません。また、Entityclass に Clone メソッドを記述しています。これが私のアプローチです。

public class Entity: ICloneable
{
    public virtual int Id { get; protected set; }

    object ICloneable.Clone()
    {
        return this.Clone();
    }

    public virtual Entity Clone()
    {
      return (Entity)this.MemberwiseClone();
    }
}

ヒントを教えてください。

4

2 に答える 2

2

オブジェクトがシリアライズ可能ではなく、それらの簡単な 1 対 1 のコピーを探しているだけの場合は、AutoMapperを使用してこれを非常に簡単に行うことができます。

// define a one-to-one map
// .ForMember(x => x.ID, x => x.Ignore()) will copy the object, but reset the ID
AutoMapper.Mapper.CreateMap<MyObject, MyObject>().ForMember(x => x.ID, x => x.Ignore());

そして、メソッドをコピーすると:

// perform the copy
var copy = AutoMapper.Mapper.Map<MyObject, MyObject>(original);

/* make copy updates here */

// evicts everything from the current NHibernate session
mySession.Clear();

// saves the entity
mySession.Save(copy); // mySession.Merge(copy); can also work, depending on the situation

私自身のプロジェクトでこのアプローチを選択したのは、レコードの複製に関するいくつかの奇妙な要件と多くの関係があるためです。これにより、レコードの複製をもう少し制御できると感じました。もちろん、私のプロジェクトでの実際の実装は多少異なりますが、基本的な構造はほぼ上記のパターンに従います。

はメモリ内に静的マップをMapper.CreateMap<TSource, TDestination>()作成するため、一度定義するだけでよいことに注意してください。CreateMap同じものを再度呼び出すTSourceTDestination、マップが既に定義されている場合はオーバーライドされます。同様に、呼び出すMapper.Reset()とすべてのマップがクリアされます。

于 2013-06-13T12:43:02.873 に答える
1

必要がある

  1. エンティティを NH で読み込む
  2. 以下のメソッドでエンティティを複製し、コピーを作成します
  3. メインエンティティを削除
  4. 変更を加えてコピーする
  5. メインエンティティへの参照なしで、コピーを更新します

クローン方法は以下の通り

         /// <summary>
     /// Clone an object without any references of nhibernate
     /// </summary> 
    public static object Copy<T>(this object obj)
    {
        var isNotSerializable = !typeof(T).IsSerializable;
        if (isNotSerializable)
            throw new ArgumentException("The type must be serializable.", "source");

        var sourceIsNull = ReferenceEquals(obj, null);
        if (sourceIsNull)
            return default(T);

        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, obj);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }

それを使用するには、次のように呼び出します

object main;
var copy = main.Copy<object>();

何を使用するかについて他の意見を見るには、このリンクも表示できますCopy object to object (with Automapper ?)

于 2013-06-13T12:17:48.637 に答える