2017-04-03 5 views
0

多くの同様の質問がありますが、簡単な解決策が見つかりません。私は下のクエリの結果をアーカイブテーブルに挿入したいと思います。すべてのフィールドをマッピングせずにテーブル間でデータをコピーする(Entity Framework)

 var record = (from a in db.contacts 
         where a.id == 1 
         select a).FirstOrDefault(); 

表は、わずか数の列だった場合、私のテーブルには、百の列がある場合はその

contacts_archive ca = new contacts_archive() 
     { 
      ca.id = record.id, 
      ca.name = record.name, 
      ..... 
     }; 

db.contacts_archive.Add(ca) 

しかし、何のようにそれを追加する問題ではないでしょうか?より良い(より速い)方法がありますか?

答えて

1

プロパティ名が正確に一致する場合は、AutoMapperやMapsterなどの自動マッパーを使用してこれを行うことができます。それ以外の場合は、ナゲットパッケージを追加する手間がなくても、反射を使用してプロパティをループすることができます。

contacts_archive ca = new contacts_archive(); 
    var archiveProps = ca.GetType().GetProperties(); 
    foreach (var prop in record.GetType().GetProperties()) { 
     if (!archiveProps.Any(a => a.Name == prop.Name)) { 
      continue; 
     } 
     prop.SetValue(ca, prop.GetValue(record)); 
    } 

これはあなたの名前とプロパティの種類が正確に一致していることを前提としています。

1

ValueInjectorまたはAutoMapperを使用して、ソースオブジェクトからデスティネーションオブジェクトに類似のフィールドをマップし、生成されたデスティネーションオブジェクトをdbに挿入すると便利です。これらのナゲットの使用方法の例をいくつか示します。 ValueInectorAutoMapper

+0

最近変更していない限り、私はValueInjectorを使用しません。それははるかに遅いです。 –

関連する問題