2017-09-14 17 views
0

あるデータベースから別のデータベースにデータを転送する必要があるため、古いデータベースのテーブルを読み込み、後でエンティティを作成して保存するプログラムを作成しようとしました新しいデータベース、それは非常に良い仕事を始めに、私は1つのテーブルのみを読んで、新しいものに転送しようとした今、私は次のエラーが表示されます。。。プロパティ 'ID'はINSERTのオブジェクトキーの一部です

"The property 'Id' is part of the object's key information and cannot be modified.

私はそのエラーを取り除くいけな​​いん。私が最初の実装(魅力のように働いた)に戻ろうとしても、テーブルの定義があります:

Table definition

そして、ここでコード:

class MappingUtility 
    { 
     public static IEnumerable<Nation> MapNation(DataTable table, IModelFactoryService service) 
     { 
      IEnumerable<DataRow> rows = table.AsEnumerable(); 
      Nation nat = service.Create<Nation>(); 
      foreach(var nation in rows) 
      { 
       nat.Id = (System.Guid)nation.ItemArray[0]; 
       nat.HVCode = (string)nation.ItemArray[1]; 
       nat.Kurzbezeichung = (string)nation.ItemArray[2]; 
       nat.KFZ = (string)nation.ItemArray[3]; 
       nat.iso_a2 = (string)nation.ItemArray[4]; 
       nat.iso_a3 = (string)nation.ItemArray[5]; 
       nat.iso_n3 = (string)nation.ItemArray[6]; 
       nat.Vollbezeichung = (string)nation.ItemArray[7]; 
       nat.Updated = DateTime.Now; 
       nat.Created = DateTime.Now; 
       yield return nat; 
      } 
     } 
    } 

    using (var da = new SqlDataAdapter("SELECT * FROM NATION", ".....")) 
    { 
     var table = new DataTable(); 
     da.Fill(table); 
     using (var context = new DAtenbankContext()) 
     { 
      int i = 0; 
      foreach (var nation in MappingUtility.MapNation(table, ef6)) 
      { 
       Debug.WriteLine(i++); 
       if (context.Nation.Where(p => p.Id == nation.Id).FirstOrDefault() == null) 
       { 
        try 
        { 
         context.Entry(nation).State = EntityState.Added; 
         context.SaveChanges(); 
        } 
        catch(DbEntityValidationException ex) 
        { 
         Debug.WriteLine(""); 
        } 
        catch (DbUpdateException ex) 
        { 
         Debug.WriteLine("There where some duplicate columns in the old table."); 
         Debug.WriteLine(ex.StackTrace); 
        } 
       } 
      }  
     } 
    } 

注:idが自動生成されていません。一度に1つの国だけを作成しようとすると、それを挿入できます。このforループでも、私は1つの国を挿入し、2番目の反復ではエラーが発生します。

+0

をあなたは 'foreach'ループにnat''のインスタンス化を移動する必要があります。ループの各反復でそのプロパティを上書きして、同じインスタンスを何度も戻しています。 – Amy

答えて

1

ループの繰り返しごとに、Nationという同じインスタンスで操作していると思われます。 1つのインスタンスを作成してから時間の経過とともに変更するように見えます。 Entity Frameworkがそのインスタンスを追跡しようとしているため、キーの変更は混乱します。

新しいインスタンスを作成しているように、ループにインスタンス化を移動し

IEnumerable<DataRow> rows = table.AsEnumerable(); 
foreach(var nation in rows) 
{ 
    Nation nat = service.Create<Nation>(); 
    // ... 
    yield return nat; 
} 
+0

あなたの答えをありがとうが、それは私の問題を解決しません。私がforeachにラインを移動すると、私は挿入を取得しませんでした。 –

+0

@PatrikSchweigl次に問題が2つあります。 – Amy

+0

@PatrikSchweigl:問題が発生したときに何が起こるのですか?あなたがデバッグすると、どこで失敗するのですか? – David

関連する問題