2011-01-17 11 views
0

Hey あるエンティティから別のエンティティへデータをコピーしたい。あるオブジェクトから別のオブジェクトへデータをコピー

MyEntity newEntity = new Entity() 
    newEntity.Property1 = oldEntity.Property1 .... 

はこれを行うための簡単な方法があります:
私はこのようなものがありますか?私は多くのプロパティを持っていて、newEntity = oldEntityのようなものを書こうと思っていますが、これは主キーの重複のため不可能です。

答えて

2

あなたは、このようなコードを使用することができます:

EntityObjectのnewObject = oldObject。 context.Detach(newObject); newObject.Id = 0; context.Entity.AddObject(newObject); context.SaveChanges();

希望します。

0

クラスにCloning Constructorを追加するのは良いですが、何か速くしたい場合は、 をType.GetFields()でループし、FieldInfoを使用してobj1からobj2に値を設定します。参照されるフィールドには注意が必要です。そして、再帰的に行う必要があります。

1

まあ、通常私はこのような状況で行うことは、あなたがこのようなもので終わることができるように、同じタイプ(C++でコピーコンストラクタと呼ばれます)のパラメータを取るコンストラクタを記述している:

// Constructor 
MyEntity(MyEntity other) 
{ 
    this.Property1 = other.Property1; 
    this.Property2 = other.Property2; 
    // etc. 
} 

次のように続いてこれを呼び出すことができます。

MyEntity entity = new MyEntity(oldEntity); 

あなたのクラスに新しいプロパティを追加する場合にのみ、一つの場所でそれを変更する必要があるように、これはまた、プロパティのコピーの振る舞いをカプセル化します。

1

さらに、ASP.NET FuturesにはModelCopierヘルパークラスがあります。

ModelCopier.CopyModel(from, to); 
0

この方法を追加してください。

private static void CopyPropertyValues(object source, object destination) 
{ 
    var destProperties = destination.GetType().GetProperties(); 

    foreach (var sourceProperty in source.GetType().GetProperties()) 
    { 
     foreach (var destProperty in destProperties) 
     { 
      if (destProperty.Name == sourceProperty.Name && 
     destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType)) 
      { 
       destProperty.SetValue(destination, sourceProperty.GetValue(
        source, new object[] { }), new object[] { }); 

       break; 
      } 
     } 
    } 
} 
0

@Nadeem_MK回答も動作します... Readonlyプロパティを処理するCanWriteフラグを追加しました。申し訳ありませんが、私は十分な補充ポイントを持っていないので、彼の答えにコメント。

private static void CopyPropertyValues(object source, object destination) 
     { 
      var destProperties = destination.GetType().GetProperties(); 
      foreach (var sourceProperty in source.GetType().GetProperties()) 
      { 
       foreach (var destProperty in destProperties) 
       { 
        if (destProperty.Name == sourceProperty.Name && 
       destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType)) 
        { 
         if(destProperty.CanWrite) 
         { 
          destProperty.SetValue(destination, sourceProperty.GetValue(
           source, new object[] { }), new object[] { }); 
         } 
         break; 
        } 
       } 
      } 
     } 
関連する問題